设计模式之装饰者模式
装饰(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 @Override 11 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 @Override 10 public void show() { 11 this.getCar().show(); 12 this.fly(); 13 } 14 15 public void fly(){ 16 System.out.println("可以飞"); 17 } 18 19 @Override 20 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 @Override 10 public void show() { 11 this.getCar().show(); 12 this.swim(); 13 } 14 15 public void swim(){ 16 System.out.println("可以游"); 17 } 18 19 @Override 20 public void run() { 21 22 } 23 24 }
总结:首线抽象组件角色定义基本功能,然后用一个实现一个基本的组件角色。这个基本的组件角色拥有基本功能。当基本的组件角色的功能不能满足时,那么就在基本功能组件角色的基础上进行增加功能,也就是装饰了;于是,需要一个装饰类,这个装饰类需要持有这个基本组件角色,然后对其装饰,具体实现又可以用具体的装饰角色来实现。
java I/O流中就用到装饰者模式(研究之后,在续写)。