标签:
一、目录 二、概述与模型 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