一、什么是装饰模式?
装饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。
二、 装饰模式中的角色和职责
抽象组件角色: 一个抽象接口,被装饰类和装饰类的父接口
具体组件角色: 为抽象组件的实现类。
抽象装饰角色: 包含一个组件的引用,并定义了与抽象组件一致的接口。
具体装饰角色: 为抽象装饰角色的实现类。负责具体的装饰。
三、原理:
增加一个装饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为装饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。装饰类必须和原来的类有相同的接口。
装饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。当有几个相互独立的功能需要扩充时,这个区别就变得很重要。在有些面向对象的编程语言中,类不能在运行时被创建,通常在设计的时候也不能预测到有哪几种功能组合。这就意味着要为每一种组合创建一个新类。相反,装饰模式是面向运行时候的对象实例的,这样就可以在运行时根据需要进行组合。一个装饰模式的示例是JAVA里的Java I/O Streams的实现。
四、具体代码:
package com.Decorator;
/**
* @Title: Car.java
* @Package
* @Description: 抽象接口
* @author xiaozhi
* @date 2016年12月3日 下午9:53:17
* @version V1.0
*/
public interface Car {
public void show();
public void run();
}
package com.Decorator;
/**
* @Title: RunCar.java
* @Package
* @Description: 抽象接口的实现类
* @author xiaozhi
* @date 2016年12月3日 下午9:56:11
* @version V1.0
*/
public class RunCar implements Car {
@Override
public void show() {
this.run();
}
@Override
public void run() {
System.out.println("可以跑");
}
}
/**
* @Title: CarDecorator.java
* @Package com.Decorator
* @Description: 抽象装饰角色--包含一个组件的引用,并定义了与抽象组件一致的接口。
* @author xiaozhi
* @date 2016年12月3日 下午11:30:07
* @version V1.0
*/
package com.Decorator;
//定义一个抽象的装饰类,并定义了与抽象组件一致的接口
public abstract class CarDecorator implements Car {
// 引入抽象角色
private Car car;
public CarDecorator(Car car) {
this.car = car;
}
public abstract void show();
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
/**
* @Title: FlyCarDecorator.java
* @Package com.Decorator
* @Description: 抽象装饰角色的实现类
* @author xiaozhi
* @date 2016年12月3日 下午11:31:59
* @version V1.0
*/
package com.Decorator;
public class FlyCarDecorator extends CarDecorator {
public FlyCarDecorator(Car car) {
super(car);
}
public void fly() {
System.out.println("可以飞");
}
@Override
public void show() {
this.getCar().show();
this.fly();
}
@Override
public void run() {
}
}
/**
* @Title: SwimCarDecorator.java
* @Package com.Decorator
* @Description: 抽象装饰角色的实现类
* @author xiaozhi
* @date 2016年12月3日 下午11:41:50
* @version V1.0
*/
package com.Decorator;
public class SwimCarDecorator extends CarDecorator {
public SwimCarDecorator(Car car) {
super(car);
}
@Override
public void show() {
this.getCar().show();
this.swim();
}
public void swim() {
System.out.println("可以游");
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
package com.Decorator;
/**
* @Title: MainClass.java
* @Package
* @Description: 测试类
* @author xiaozhi
* @date 2016年12月3日 下午9:53:03
* @version V1.0
*/
public class MainClass {
public static void main(String[] args) {
Car car = new RunCar();
car.show();
System.out.println("。。。。。。。。。。。。。。");
Car Swimcar = new RunCar();
// 装饰普通车,使其增加游泳的功能
CarDecorator carDecorator1 = new SwimCarDecorator(Swimcar);
carDecorator1.show();
System.out.println("。。。。。。。。。。。。。。");
/**
* 多重装饰
*/
Car Swimcar1 = new RunCar();
// 装饰普通车,使其增加游泳的功能
CarDecorator carDecorator2 = new SwimCarDecorator(Swimcar1);
// 装饰已经装饰过得增加了游泳功能的车,使其再增加飞的功能
CarDecorator carDecorator3 = new FlyCarDecorator(carDecorator2);
carDecorator3.show();
}
}
五、测试结果:
可以跑
。。。。。。。。。。。。。。
可以跑
可以游
。。。。。。。。。。。。。。
可以跑
可以游
可以飞