首页 > 代码库 > 装饰者模式-轻松记住IO类的关系与API
装饰者模式-轻松记住IO类的关系与API
一、目录
二、概述与模型
1、概述
含义:控制对对象的访问。
作用:详细控制某个(某类)某对象的方法,在调用之前做前置处理,调用之后做后置处理,从而实现将统一流程代码放在代理类中处理。
优点:
缺点:
2、模型
Component(抽象组件):定义代理角色和真实角色的公共对外方法。
ConcreteComponent(真实组件):实现抽象角色,定义真实角色所要实现的真实业务逻辑,供代理角色调用。
Decorator(抽象装饰者):实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
ConcreteDecorator(真实装饰者):
最终目标:将统一的流程控制放到代理角色处理。
三、应用场景描述
1、安全代理:屏蔽对真实角色的直接访问,由代理角色控制,等业务真实需要的时候,才由代理对象调用真实对象方法。
2、远程代理:通过代理类处理远程方法调用(RMI)。
3、延迟代理:先加载轻量级的代理对象,真正需要再加载真实对象。例如加载图片、视频,先由代理对象在后台开启流对象,待真正需要浏览图片、视频的时候,才由真实对象加载图片,最后由代理对象关闭流对象。
4、事务:解决概述举例内容,一层不变的内容由代理对象承担,而真正的业务逻辑由真实对象的方法实现。
5、真实系统的日志处理、JDBC事务、Connection的开启与关闭。
代码演示场景描述:假设一个明星被邀请去拍广告、拍电影,那么务必有这些流程:面谈->起草合同->安排机票、车票->出席活动->结算尾款。假设一年拍一两次广告,那么完全由一个明星自己解决。事实上,每个明星都有经纪人,而明星只专心负责出席活动,其他事务由经纪人操作。
四、代码演示
1、抽象组件
public abstract class Component { public abstract void display();}
2、真实组件
public class ConcreteComponent extends Component{ public void display() { System.out.println("我是一块泥土墙!"); }}
3、抽象装饰者
public class Decorator extends Component{ protected Component component; public Decorator(Component component) { this.component = component; } public Component getComponent() { return component; } public void setComponent(Component component) { this.component = component; } public void display() { component.display(); }}
4、真实装饰者
//装饰者A:泥土墙
public class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } @Override public void display() { this.component.display(); System.out.println("在泥土墙上加上水泥!"); }}
//装饰者B:带墙纸的墙
public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } @Override public void display() { this.component.display(); System.out.println("在墙皮上添加墙纸"); }}
5、客户端
public class Client { public static void main(String [] args){ //新建一面泥土墙:原始组件对象 Component wall=new ConcreteComponent(); //装饰者A:为泥土墙添加水泥 ConcreteDecoratorA cementWall=new ConcreteDecoratorA(wall); cementWall.display(); System.out.println("-----------分割线-------------"); //装饰B:为泥土墙添加墙纸 ConcreteDecoratorB paperWall=new ConcreteDecoratorB(wall); paperWall.display(); System.out.println("-----------分割线-------------"); //装饰者B:为水泥墙(装饰者A)添加墙纸 ConcreteDecoratorB mixedWall=new ConcreteDecoratorB(cementWall); mixedWall.display(); }}
6、测试结果
装饰者模式-轻松记住IO类的关系与API