标签:style blog color os java 使用 io strong ar
抽象构件:
package com.lp.ecjtu.patten.decorator; public interface Component { public void Operation(); }
具体构件:
package com.lp.ecjtu.patten.decorator; public class ConcreteComponent implements Component { @Override public void Operation() { //写相关的业务代码 } }
装饰类:
package com.lp.ecjtu.patten.decorator; public class Decorator implements Component{ //体现了聚合关系,Decorator是整体,Component部分,Decorator由Component聚合而成 private Component component;//数据类型为Component的属性 public Decorator(Component component){//构造方法传入Component组件 this.component = component; } public Decorator(){ } @Override public void Operation() { // TODO Auto-generated method stub component.Operation();//增强功能 } }
具体装饰角色:
package com.lp.ecjtu.patten.decorator; public class ConcreteDecoratorA extends Decorator { @Override public void Operation() { // TODO Auto-generated method stub super.Operation(); } } package com.lp.ecjtu.patten.decorator; public class ConcreteDecoratorB extends Decorator { @Override public void Operation() { // TODO Auto-generated method stub super.Operation(); } }
package com.lp.ecjtu.patten.decorator1; /** * 抽象构件 * @author Administrator * */ public interface Person { public void coding(); }
package com.lp.ecjtu.patten.decorator1; /** * 具体提构件类,要接收附加责任的类,程序员 * @author Administrator * */ public class Employee implements Person { @Override public void coding() { System.out.println("程序员加班写程序,写程序啊,最终写完了项目。。。。"); } }
package com.lp.ecjtu.patten.decorator1; /** * 装饰类 * @author Administrator * */ public class Decorator implements Person{ private Person Person; public Decorator(Person Person){ } @Override public void coding() { Person.coding(); } }
package com.lp.ecjtu.patten.decorator1; /** * 具体装饰类,项目经理A职责 * @author Administrator * */ public class ManagerDecoratorA extends Decorator{ private Person person; public ManagerDecoratorA(Person person) { super(person); this.person = person; } @Override public void coding() {//增强父类coding方法的功能 doEarlyWork(); person.coding(); } private void doEarlyWork() { System.out.println("项目经理A做需求分析"); System.out.println("项目经理A做架构设计"); System.out.println("项目经理A做详细设计"); } }
package com.lp.ecjtu.patten.decorator1; /** * 具体装饰类,项目经理B * @author Administrator * */ public class ManagerDecoratorB extends Decorator{ private Person person; public ManagerDecoratorB(Person person) { super(person); this.person = person; } @Override public void coding() {//增强父类coding方法的功能 doEndWork(); person.coding(); } private void doEndWork() { System.out.println("项目经理B做首尾工作"); } }
package com.lp.ecjtu.patten.decorator1; public class Client { /** * @param args */ public static void main(String[] args) { // Person employee = new Employee();//要接收户责任的对象(具体构件) // Person managerB = new ManagerDecoratorB(employee);//赋予程序员项目经理B的责任 // Person managerA = new ManagerDecoratorA(managerB);//赋予程序员项目经理A的责任 new ManagerDecoratorA(new ManagerDecoratorB(new Employee())).coding();; //managerA.coding(); } }
运行结果:
项目经理A做需求分析
项目经理A做架构设计
项目经理A做详细设计
项目经理B做首尾工作
程序员加班写程序,写程序啊,最终写完了项目。。。。
分析:系统把人类Person从一个程序员Employee装饰成了项目经理B(把项目经理B的功能加到程序员身上),然后把项目经理B装饰成了项目经理A(把项目经理A的责任加到程序员+项目经理B的身上)。
如下图所示:
Person employee = new Employee();//多态的方式
Person managerB = new ManagerDecoratorB(employee);
这样是对的。如果是下面的:
Employee employee = new Employee();
ManagerDecoratorB managerB = new ManagerDecoratorB(employee);
就不对了
装饰模式在Java语言中的最著名的应用莫过于Java I/O标准库的设计了。
由于Java I/O库需要很多功能的各种组合,如果这些功能都是用继承的方法实现的,那么每一种组合都需要一个类,这样就会造成大量功能重复的类出现。而如果采用装饰模式,那么类的数目就会大大减少,功能的重复也可以减至最少。因此装饰模式是Java I/O库的基本模式。
Java I/O库的对象结构图如下,由于Java I/O的对象众多,因此只画出InputStream的部分。
根据上图可以看出:
● 抽象构件(Component)角色:由InputStream扮演。这是一个抽象类,为各种子类型提供统一的接口。
● 具体构件(ConcreteComponent)角色:由ByteArrayInputStream、FileInputStream、PipedInputStream、StringBufferInputStream等类扮演。它们实现了抽象构件角色所规定的接口。
● 抽象装饰(Decorator)角色:由FilterInputStream扮演。它实现了InputStream所规定的接口。
● 具体装饰(ConcreteDecorator)角色:由几个类扮演,分别是BufferedInputStream、DataInputStream以及两个不常用到的类LineNumberInputStream、PushbackInputStream。
通过java Io里面的类进行讲解:
“inputStreamReader”是字节流向字符流转化的桥梁,但inputStreamReader绝对不是桥梁模式。inputStreamReader是Reader类型,它把一个InputSream的类型包装起来,从而把字节流的API转化成了字符流的API.这是适配器模式的例子。inputStreamReader把InputSream的API适配成了Reader的API.所以inputStreamReader不是装饰模式而是适配模式。同理OutputStreamWriter也是适配模式。
BUfferedReader是一个装饰类,因为它继承Reader,把Reader包装,在Reader的基础上实现了比Reader更强大的功能。但是还是Reader的API.
标签:style blog color os java 使用 io strong ar
原文地址:http://www.cnblogs.com/200911/p/3941520.html