Java是一門面向?qū)ο缶幊陶Z(yǔ)言,其中設(shè)計(jì)模式在軟件開發(fā)中扮演了重要的角色。
裝飾者模式和動(dòng)態(tài)代理是兩種比較常用的設(shè)計(jì)模式,在Java開發(fā)中得到了廣泛的應(yīng)用。
1. 裝飾者模式
裝飾者模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許向現(xiàn)有對(duì)象中添加新的功能,同時(shí)又不改變其原有的結(jié)構(gòu)。
在Java中,裝飾者模式可以通過接口實(shí)現(xiàn)。例如,有一個(gè)接口Car,它有一個(gè)run()方法:
public interface Car { void run(); }
現(xiàn)在我們有一個(gè)具體的實(shí)現(xiàn)類BasicCar:
public class BasicCar implements Car { @Override public void run() { System.out.println("BasicCar is running"); } }
現(xiàn)在,我們想要給BasicCar添加新的功能,比如說讓它可以自動(dòng)駕駛。
我們可以定義一個(gè)新的裝飾類,繼承Car接口,同時(shí)在實(shí)現(xiàn)run()方法的時(shí)候,調(diào)用BasicCar的run()方法,并在其前后添加新的功能。例如:
public class SelfDrivingCarDecorator implements Car { private Car car; public SelfDrivingCarDecorator(Car car) { this.car = car; } @Override public void run() { System.out.println("Self driving mode activated"); car.run(); System.out.println("Self driving mode deactivated"); } }
現(xiàn)在,我們可以這樣來使用裝飾者模式:
Car car = new BasicCar(); car = new SelfDrivingCarDecorator(car); car.run();
通過裝飾者模式,我們成功地讓BasicCar具有了自動(dòng)駕駛功能,在不改變BasicCar代碼的情況下,實(shí)現(xiàn)了新的功能擴(kuò)展。
2. 動(dòng)態(tài)代理
動(dòng)態(tài)代理是一種面向?qū)ο缶幊讨械某S眉夹g(shù),它可以在運(yùn)行時(shí)創(chuàng)建一個(gè)實(shí)現(xiàn)了指定接口的代理類。
在Java中,動(dòng)態(tài)代理可以通過Java自帶的java.lang.reflect.Proxy類實(shí)現(xiàn)。
例如,我們有一個(gè)接口Hello,它有一個(gè)方法sayHello():
public interface Hello { void sayHello(); }
現(xiàn)在,我們可以使用動(dòng)態(tài)代理來實(shí)現(xiàn)一個(gè)具體的實(shí)例,用來調(diào)用Hello接口的sayHello()方法。例如:
public class HelloProxy implements InvocationHandler { private Hello hello; public HelloProxy(Hello hello) { this.hello = hello; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before say hello"); method.invoke(hello, args); System.out.println("After say hello"); return null; } } Hello hello = new HelloImpl(); Hello proxy = (Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), new HelloProxy(hello)); proxy.sayHello();
在這個(gè)例子中,我們使用了動(dòng)態(tài)代理來創(chuàng)建了一個(gè)Hello接口的代理實(shí)例,代理實(shí)例中會(huì)調(diào)用原始的HelloImpl的sayHello()方法,并在其前后添加了新的功能。
總結(jié)來說,裝飾者模式和動(dòng)態(tài)代理都是Java面向?qū)ο缶幊讨斜容^常用的技術(shù),可以在不改變?cè)蓄惖拇a的情況下,增加新的功能和實(shí)現(xiàn)代理。