版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dahaiaaaqe/article/details/78472879
一、什么是装饰模式
装饰( Decorator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。
简单说:让我们来假设一下,你正在寻找一个女朋友。有很多来自不同国家的女孩,比如:美国,中国,日本,法国等等,他们每个人都有不一样的个性和兴趣爱好,如果需要在程序当中模拟这么一种情况的话,假设每一个女孩就是一个Java类的话,那么就会有成千上万的类,这样子就会造成类的膨胀,而且这样的设计的可扩展性会比较差。因为如果我们需要一个新的女孩,就需要创建一个新的Java类,这实际上也违背了在程序开发当中需要遵循的OCP(对扩展开放,对修改关闭)原则。让我们来重新做另外一种设计,让每一种个性或者兴趣爱好成为一种装饰从而可以动态地添加到每一个女孩的身上。
二、装饰模式的结构
1.Component(被装饰对象的基类定义一个对象接口,可以给这些对象动态地添加职责。
2.ConcreteComponent(具体被装饰对象)
定义一个对象,可以给这个对象添加一些职责。
3.Decorator(装饰者抽象类)
维持一个指向Component实例的引用,并定义一个与Component接口一致的接口。
4.ConcreteDecorator(具体装饰者)
具体的装饰对象,给内部持有的具体被装饰对象,增加具体的职责。
代码:
Car.java
//Component(被装饰对象的基类接口
public interface Car {
public abstract void show();
public abstract void run();
}
RunCar.java
public class RunCar implements Car {
@Override
public void show() {
run();
}
@Override
public void run() {
System.out.println("汽车能跑");
}
}
CarDecorator.java
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;
}
public abstract void show();
}
FlyCar.java
public class FlyCar extends CarDecorator {
public FlyCar(Car car) {
super(car);
}
@Override
public void run() {
}
@Override
public void show() {
this.getCar().show();
fly();
}
public void fly(){
System.out.println("汽车能飞");
}
}
SwimCar.java
public class SwimCar extends CarDecorator{
public SwimCar(Car car) {
super(car);
}
@Override
public void show() {
this.getCar().show();
swim();
}
@Override
public void run() {
}
public void swim(){
System.out.println("汽车能游泳");
}
}
Main .java
//测试类
public class Main {
public static void main(String[] args) {
Car a = new RunCar();
a.show();
System.out.println("------------");
CarDecorator c = new FlyCar(a);
c.show();
System.out.println("------------");
CarDecorator c1 = new SwimCar(c);
c1.show();
//运行结果
//汽车能跑
//------------
//汽车能跑
//汽车能飞
//------------
//汽车能跑
//汽车能飞
//汽车能游泳
}
}