设计模式(五) 装饰者模式

定义

装饰( Decorator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。

装饰者模式的结构

装饰模式的角色和职责

  • 抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口(Car)。

      public interface Car {
      
      	void run();
      
      	void show();
      
      }
    
  • 具体组件角色:为抽象组件的实现类(FlyCar、SwinCarDecorator)。

      public class FlyCarDecorator extends CarDecorator {
      
      	public FlyCarDecorator(Car car) {
      		super(car);
      
      	}
      
      	@Override
      	public void run() {
      
      	}
      
      	private void fly() {
      		System.out.println("可以飞的车");
      	}
      
      	@Override
      	public void show() {
      		this.getCar().show();
      		fly();
      	}
      
      }
    
      public class SwimCarDecorator extends CarDecorator {
      
      	public SwimCarDecorator(Car car) {
      		super(car);
      	}
      
      	private void swim() {
      		System.out.println("可以游的车");
      	}
      
      	@Override
      	public void run() {
      
      	}
      
      	@Override
      	public void show() {
      		this.getCar().show();
      		swim();
      	}
      
      }
    
  • 抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口(CarDecorator)。

      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;
      	}
      }
    
  • 具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰(RunCar)。

      /*被修饰的对象*/
      public class RunCar implements Car {
      
      	@Override
      	public void run() {
      		System.out.println("可以跑的车");
      	}
      
      	@Override
      	public void show() {
      		run();
      	}
      	
      }
    
  • Main方法

      public class Main {
      
      	public static void main(String[] args) {
      		Car car = new RunCar();
      		CarDecorator flyCar = new FlyCarDecorator(car);
      		CarDecorator swimCar = new SwimCarDecorator(flyCar);
      		swimCar.show();
      	}
      
      }
    
posted @ 2017-09-25 20:02  esileme  阅读(126)  评论(0编辑  收藏  举报