首页 > 代码库 > 装饰者模式-轻松记住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