装饰者模式
装饰者模式动态的将责任附加在对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能的拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。
装饰者模式的结构
其中Component是一个超类,ConcreteComponen是被装饰者,Decorator是装饰者,装饰者和被装饰者有共同的超类Component,但是此时我们发现Decorator和Component还有另外一条线,这条线表示Decorator还要组合Component。
(1)装饰者和被装饰者对象有相同的超类型
(2)可以用一个或多个装饰者包装对象
(3)既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象的场合,可以用装饰过的对象代替它
(4)装饰者可以再所委托被装饰者的行为之前与之后,加上自己的行为,已达到特定的目的
(5)对象可以在任何时候被装饰,所以可以再运行时动态的,不限量的用你喜欢的装饰对象
源代码
超类
package com.panlong;
public interface Car {
public void show();
public void Run();
}
被装饰者
package com.panlong;
public class RunCar implements Car {
public void show() {
this.Run();
}
public void Run() {
System.out.println("可以跑");
}
}
装饰者
package com.panlong;
public abstract class CarDecorator implements Car {
private Car car;
public CarDecorator(Car car) {
this.car=car;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
定义几种装饰
package com.panlong;
public class FlyCarDecorator extends CarDecorator{
public FlyCarDecorator(Car car) {
super(car);
}
public void show() {
this.getCar().show();
this.fly();
}
public void fly() {
System.out.println("可以飞");
}
public void Run() {
}
}
package com.panlong;
public class SwimCarDecorator extends CarDecorator {
public SwimCarDecorator(Car car) {
super(car);
// TODO 自动生成的构造函数存根
}
public void show() {
this.getCar().show();
this.swim();
}
public void swim() {
System.out.println("可以游");
}
public void Run() {
// TODO 自动生成的方法存根
}
}
package com.panlong;
public class SkyCarDecorator extends CarDecorator {
public SkyCarDecorator(Car car) {
super(car);
// TODO 自动生成的构造函数存根
}
public void show() {
this.getCar().show();
this.Sky();
}
public void Run() {
// TODO 自动生成的方法存根
}
public void Sky() {
System.out.println("可以上天");
}
}
package com.panlong;
public class MainClass {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Car car=new RunCar();
car.show();
System.out.println("------------");
FlyCarDecorator flyCarDecorator=new FlyCarDecorator(car);
flyCarDecorator.show();
System.out.println("------------");
SwimCarDecorator swimCarDecorator=new SwimCarDecorator(flyCarDecorator);
swimCarDecorator.show();
System.out.println("------------");
SkyCarDecorator skyCarDecorator=new SkyCarDecorator(swimCarDecorator);
skyCarDecorator.show();
}
}