装饰(Decorator)模式又叫做包装模式。通过一种对客户短透明的方式扩展对象的功能,是继承关系的一个替换方案。
抽象组件角色:一个抽象接口,是被装饰类和装饰类的父接口。
具体组件角色:为抽象组件的实现类。
抽象装饰角色:包含一个组件的应用,并定义了与抽象组件一致的接口。
具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰。
例子:
抽象组件角色Car:
1 package com.Design.Decorator1;2 3 public interface Car {4 5 public void show();6 7 public void run();8 9 }
具体组件角色RunCar(实现基本的功能):
1 package com.Design.Decorator1; 2 3 public class RunCar implements Car { 4 5 @Override 6 public void show() { 7 this.run(); 8 } 9 10 @Override11 public void run() {12 System.out.println("可以跑");13 }14 15 }
抽象装饰角色CarDecorator:
1 package com.Design.Decorator1; 2 3 public abstract class CarDecorator implements Car{ 4 5 private Car car; 6 7 public CarDecorator(Car car){ 8 this.car = car; 9 }10 11 public abstract void show();12 13 public Car getCar() {14 return car;15 }16 17 public void setCar(Car car) {18 this.car = car;19 }20 21 22 23 }
具体装饰角色FlyCarDecorator:
1 package com.Design.Decorator1; 2 3 public class FlyCarDecorator extends CarDecorator{ 4 5 public FlyCarDecorator(Car car) { 6 super(car); 7 } 8 9 @Override10 public void show() {11 this.getCar().show();12 this.fly();13 }14 15 public void fly(){16 System.out.println("可以飞");17 }18 19 @Override20 public void run() {21 22 }23 24 }
具体装饰角色SwimCarDecorator:
1 package com.Design.Decorator1; 2 3 public class SwimCarDecorator extends CarDecorator { 4 5 public SwimCarDecorator(Car car) { 6 super(car); 7 } 8 9 @Override10 public void show() {11 this.getCar().show();12 this.swim();13 }14 15 public void swim(){16 System.out.println("可以游");17 }18 19 @Override20 public void run() {21 22 }23 24 }
总结:首线抽象组件角色定义基本功能,然后用一个实现一个基本的组件角色。这个基本的组件角色拥有基本功能。当基本的组件角色的功能不能满足时,那么就在基本功能组件角色的基础上进行增加功能,也就是装饰了;于是,需要一个装饰类,这个装饰类需要持有这个基本组件角色,然后对其装饰,具体实现又可以用具体的装饰角色来实现。
java I/O流中就用到装饰者模式(研究之后,在续写)。