装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案
其实这里可以理解为,我不想在原始类上做修改,但是我又想在原始功能上增加一些功能
组件抽象类:
package com.asiainfo.decorator;
/**
* 抽象组件
* @author Administrator
*
*/
public interface ICar {
public void run();
}
组件实现类
package com.asiainfo.decorator;
/**
* 具体实现组件
* @author Administrator
*
*/
public class Car implements ICar{
public void run() {
System.out.println("陆上跑");
}
}
装饰角色
package com.asiainfo.decorator;
/**
* 装饰角色
* @author Administrator
*
*/
public class Decorator implements ICar{
private ICar car;
public Decorator(ICar car){
this.car=car;
}
public void run() {
// 委派给构件
car.run();
}
}
具体装饰对象
package com.asiainfo.decorator;
public class FlyCar extends Decorator{
public FlyCar(ICar car) {
super(car);
}
//扩展功能
public void fly(){
System.out.println("天上飞");
}
public void run() {
fly();
super.run();
}
}
package com.asiainfo.decorator;
public class WaterCar extends Decorator {
public WaterCar(ICar car) {
super(car);
}
//扩展功能
public void swin() {System.out.println("水里游");}public void run() { swin(); super.run();}}
测试:
package com.asiainfo.test;
import com.asiainfo.decorator.Car;
import com.asiainfo.decorator.FlyCar;
import com.asiainfo.decorator.WaterCar;
public class TestDecorator
public static void main(String[] args) {
//定义实体对象
Car car= new Car();
//装饰对象
FlyCar fly = new FlyCar(car);
fly.run();
WaterCar water = new WaterCar(car);
water.run();
//实现两种装饰
System.out.println("=================");
WaterCar water1 = new WaterCar(new FlyCar(car));
water1.run();
}
}
结果:
天上飞
陆上跑
水里游
陆上跑
=================
水里游
天上飞
陆上跑
其实我们IO流 也是装饰模式
BufferedReader(new InputStreamReader(new FileInputStream(new File("d://123.txt"))))
new File("d://123.txt"):源实体类
new FileInputStream() : 装饰类
new InputStreamReader:适配器
其实我们IO流也用到了适配器模式 就如InputStreamReader OutputStreamWriter