07装饰模式Decorator

时间:2021-10-28 23:52:09

一、什么是装饰模式

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

二、装饰模式的结构

07装饰模式Decorator

三、装饰模式的角色和职责

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

  具体组件角色:为抽象组件的实现类。

  抽象装饰角色:包含一个组件的引用,并定义了 与抽象组件一致的接口。

  具体装饰角色:为抽象装饰角色的实现类。负责 具体的装饰。

没装饰前

车接口

 //车接口
public interface Car { public void show(); public void run();
}
可以跑的车
 //可以跑的车
public class RunCar implements Car { public void run() {
System.out.println("可以跑");
} public void show() {
this.run();
}
}

会飞的车

 //会飞的车
public class FlyCar implements Car { public void show() {
this.run();
this.fly();
} public void run() {
System.out.println("可以跑");
} public void fly() {
System.out.println("可以飞");
}
}

游泳的车

 //游泳的车
public class SwimCar implements Car{ public void run() {
System.out.println("可以跑");
} public void Swim() {
System.out.println("可以游");
} public void show() {
this.run();
this.Swim();
}
}

测试

 public class MainClass {
public static void main(String[] args) {
Car flycar = new SwimCar();
flycar.show();
}
}

===========================================================================

车接口

 public interface Car {

     public void show();

     public void run();
}

可以跑的车

 //可以跑的车
public class RunCar implements Car { public void run() {
System.out.println("可以跑");
} public void show() {
this.run();
}
}

车装饰

 //汽车装饰
public abstract class CarDecorator implements Car{
private Car car; public Car getCar() {
return car;
} public void setCar(Car car) {
this.car = car;
} public CarDecorator(Car car) {
this.car = car;
} public abstract void show();
}

游泳车装饰

 //游泳车装饰
public class SwimCarDecorator extends CarDecorator { public SwimCarDecorator(Car car) {
super(car);
} public void show() {
this.getCar().show();
this.swim();
} public void swim() {
System.out.println("可以游");
} public void run() { }
}

飞车装饰

 //飞车装饰
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() { }
}

测试

 public class MainClass {
public static void main(String[] args) {
Car car = new RunCar(); car.show();
System.out.println("---------"); Car swimcar = new SwimCarDecorator(car);
swimcar.show();
System.out.println("---------"); Car flySwimCar = new FlyCarDecorator(swimcar);
flySwimCar.show();
}
}