样例代码
public class DaiLi {
public DaiLi() {
/**
* 步骤4:使用代理
* 需要使用哪个就代理哪个
* 使用代理可以满足软件开发的开闭原则,即对功能扩展开放,对修改关闭
*/
//DaiLiClass.getInstance().init(new Facade1());
//DaiLiClass.getInstance().init(new Facade2());
DaiLiClass.getInstance().init(new FacadeN());
}
public void start() {
//使用代理的相应实现方法
DaiLiClass.getInstance().get();
DaiLiClass.getInstance().set();
}
}
/**
* 步骤1:定义接口
*/
interface DaiLiInterface {
void get();
void set();
}
/**
* 步骤2:对接口进行实现
*/
//接口的第一个实现
class Facade1 implements DaiLiInterface {
@Override
public void get() {
//实现接口的get方法
System.out.println("我是Facade1的get方法");
}
@Override
public void set() {
//实现接口的set方法
System.out.println("我是Facade1的set方法");
}
}
//接口的第二个实现
class Facade2 implements DaiLiInterface {
@Override
public void get() {
//实现接口的get方法
System.out.println("我是Facade2的get方法");
}
@Override
public void set() {
//实现接口的set方法
System.out.println("我是Facade2的set方法");
}
}
//接口的第N个实现
class FacadeN implements DaiLiInterface {
@Override
public void get() {
//实现接口的get方法
System.out.println("我是FacadeN的get方法");
}
@Override
public void set() {
//实现接口的set方法
System.out.println("我是FacadeN的set方法");
}
}
/**
* 步骤3:对接口进行代理
*/
//代理类
class DaiLiClass implements DaiLiInterface {
private DaiLiInterface daiLi;
private DaiLiClass() {
}
//单例实现
public static DaiLiClass getInstance() {
return DaiLiHolder.instance;
}
private static class DaiLiHolder {
private static final DaiLiClass instance = new DaiLiClass();
}
//init方法实现代理
public void init(DaiLiInterface daiLi) {
this.daiLi = daiLi;
}
@Override
public void get() {
//代理调用相应实现类的get方法
daiLi.get();
}
@Override
public void set() {
//代理调用相应实现类的set方法
daiLi.set();
}
}
上述样例涉及到软件开发的两个原则:单一职责原则和开闭原则,使用到的设计模式有单例模式、外观模式和代理模式,极大的提高了代码的可扩展性和灵活性,此外还有动态代理模式,以后有空会进行补充~
动态代理模式
为什么要用动态代理模式,我的理解是省去创建并维护一个代理类的工作量,比如当上述DaiLiInterface的方法增加时,还要同步增加DaiLiClass中的代码,当方法有很多时,会产生很多没必要的代码,此时可以考虑使用动态代理模式:
样例代码
public class DynamicDaiLI implements InvocationHandler {
private Object proxyObject;
private static DaiLiInterface daiLiInterface;
public Object newProxyInstance(Object proxyObject) {
this.proxyObject = proxyObject;
daiLiInterface=(DaiLiInterface)Proxy.newProxyInstance(proxyObject.getClass().getClassLoader(), proxyObject.getClass().getInterfaces(), this);
return daiLiInterface;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(proxyObject, args);
return result;
}
public static DaiLiInterface getInstance(){
return daiLiInterface;
}
@Test
public void test(){
DynamicDaiLI dynamicDaiLI=new DynamicDaiLI();
dynamicDaiLI.newProxyInstance(new Facade2());
DynamicDaiLI.getInstance().set();
DynamicDaiLI.getInstance().get();
}
}