轻松记住IO类的关系与API

时间:2022-04-08 07:51:02

标签:

一、目录

二、概述与模型 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