结构模式
2018-08-17 本文已影响0人
小张同学_loveZY
7. 代理模式
代理模式的本质:控制对象访问。
静态代理
-
外部公共接口
public interface Subject { /** * 示意方法:一个抽象的请求方法 */ public void request(); }
-
具体实现类
public class RealSubject implements Subject{ public void request() { //执行具体的功能处理 } }
-
具体代理类
public class Proxy implements Subject{ private RealSubject realSubject=null; public Proxy(RealSubject realSubject){ this.realSubject = realSubject; } public void request() { //在转调具体的目标对象前,可以执行一些功能处理 //转调具体的目标对象的方法 realSubject.request(); //在转调具体的目标对象后,可以执行一些功能处理 } }
- 由于代理的存在,可以在访问具体实现之前进行权限验证、附加功能等等。
动态代理(java)
- java.lang.reflect 包
- Proxy 类
- InvocationHandler 接口
- 动态代理类始终只有一个invoke方法
-
由于java动态代理是通过接口实现的,故先定义接口
public interface ICook { void dealWithFood(); void cook(); }
-
具体的实现类
public class CookManager implements ICook { @Override public void dealWithFood() { System.out.println("food had been dealed with"); } @Override public void cook() { System.out.println("cook food"); } }
-
代理类,需要实现InvocationHandler接口,其中的invoke调用具体的功能代码。
public class DynamicProxyHandler implements InvocationHandler{ Object realCookManager; // 注入真正的实现类 DynamicProxyHandler(ICook realCookManager){ this.realCookManager = realCookManager; } // 调用具体方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("invoke start"); method.invoke(realCookManager,args); System.out.println("invoke end"); return null; } }
-
客户端
public class Main { public static void main(String[] args){ CookManager cookManager = new CookManager(); // 代理类 DynamicProxyHandler dynamicProxyHandler = new DynamicProxyHandler(cookManager); // 通过Proxy的newProxyInstance中的反射机制,生成最后的代理类 ICook iCook =(ICook)Proxy.newProxyInstance(dynamicProxyHandler.getClass().getClassLoader(),cookManager.getClass().getInterfaces(), dynamicProxyHandler); //代理类调用具体的方法,输入正确的参数。 iCook.dealWithFoot(); iCook.cook(); } }
- 角色:代理类,实际类。代理类和实际类实现同一个接口,客户端通过代理类调用实现类的具体方法。
8. 装饰者
- 装饰模式的本质:功能细化,动态组合。 奖金计算例子
- 可以参考代理模式,装饰模式在代理模式上多了一层抽象,然后下分出多个实现。
- 装饰者模式主要是用来增加类的职责和行为的,将类的核心职责和装饰功能区分开,可以很方便对装饰功能进行添加和去除。
- 代理模式主要是完成被代理的功能,同时可以做一些验证工作。
- 角色:
- 抽样功能类
- 具体功能类
- 抽象装饰者
- 具体装饰者:多个不同的复杂实现,包装功能类
9. 外观模式
- 一个是界面,一个是接口:为一组子系统定义一个统一的接口。
- 减少外界与子系统内多个模块的交互,松散耦合。
- 外观模式的本质:封装交互,简化调用。
- 角色:
- facade 类,对客户端提供统一的访问接口方法
- 具体系统子类,系统内部具体完成功能的子类
- 抽象系统子类
10. 适配器模式
- 适配器模式的本质:转换匹配,复用功能。
- 适配器通常是一个类,一般会让适配器类去实现Target接口,在适配器的具体实现里面调用Adaptee。
- 体现更好的复用性,更好的扩展性
- 角色:
- 适配器类,实现目标接口,并适配适配类,调用其中功能
- 被适配类
- 目标接口
11. 桥接模式
- 桥接模式的本质:分离两个维度的功能。
- 将系统按两个维度区分考虑,并且桥接使用(桥接后还可作为一个维度与另一个功能桥接)。从而避免多对多情况下复杂逻辑组合。
- 角色:
- X维度虚功能类,其中组合一个Y维度的功能接口
- X维度具体功能类(可扩展)
- Y维度功能接口
- Y维度实现类
12. 组合模式结构
- 组合模式的本质:统一叶子对象和组合对象的操作,易形成树结构的模型。
- 组合模式自带部分与整体的关系。
- 角色:
- 抽象组件
- 继承抽象组件的叶子结点(不包含抽象组件成员)
- 继承抽象组件的组件节点(含抽象组件),也即组合来意。
13. 享元模式
- 享元模式的本质:分离与共享。
- 减少对象数量,节省内存空间,如共用的缓存数据,数据库连接池等
- 应用场景:应用中包含大量的重复的细粒度数据,将其抽取出来共享管理。
- 角色:
- 享元工厂:内含一个hashMap的缓存保存细粒度数据。
- 享元接口:抽象出功能
- 共享类:
- 非共享类