码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器模式

时间:2020-04-07 20:21:49      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:生成   this   one   ali   protected   pre   ons   基础   sam   

视频链接:B站审核中。。。。。。。。。

 

什么是装饰器模式

 

装饰器模式的说明:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。原文是:Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.

类图如下:技术图片

 

 各个角色的说明如下:

Component,抽象构件

  Component是一个接口或者抽象类,是定义我们最核心的对象,也可以说是最原始的对象。

ConcreteComponent,具体构件,或者基础构件

  ConcreteComponent是最核心、最原始、最基本的接口或抽象类Component的实现,可以单独用,也可将其进行装饰,比如下面的简单汽车。

Decorator,装饰角色

  一般是一个抽象类,继承自或实现Component,在它的属性里面有一个变量指向Component抽象构件,这是装饰器最关键的地方。

ConcreteDecorator,具体装饰角色

  ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,它们可以把基础构件装饰成新的东西,比如把一个普通汽车装饰成水上汽车或飞行汽车。

 

技术图片

 

 

光解释比较抽象,我们来看看代码实现:

package Decorator;

/**
 * 实现抽象组件,具体构件和装饰器
 * 
 * @author 唐磊
 *
 */

public interface ICar {// 抽象组件
    void move();

}

class Car implements ICar {// ConcreteComponent,具体构件

    @Override
    public void move() {
        System.out.println("功能:陆地上跑");
        // TODO 自动生成的方法存根

    }

}

class DecoratorCar implements ICar {// 装饰器
    protected ICar car;// 持有真实构件的引用

    public DecoratorCar(ICar car) {
        super();
        this.car = car;
    }

    @Override
    public void move() {
        car.move();

    }

}
//ConcreteDecorator,具体装饰角色
class FlyDecoratorCar extends DecoratorCar {

    public FlyDecoratorCar(ICar car) {
        super(car);

    }
    public void fly() {
        System.out.println("功能+1:车可以飞啦!");
    }
    @Override
    public void move() {
        super.move();
        fly();

    }

}
//ConcreteDecorator,具体装饰角色
class WaterDecoratorCar extends DecoratorCar {

    public WaterDecoratorCar(ICar car) {
        super(car);

    }
    public void swim() {
        System.out.println("功能+1:车可以在水里前进啦!");
    }
    @Override
    public void move() {
        super.move();
        swim();

    }

}
//ConcreteDecorator,具体装饰角色
class AIDecoratorCar extends DecoratorCar {

    public AIDecoratorCar(ICar car) {
        super(car);

    }
    public void autoMove() {
        System.out.println("功能+1:全自动人工智能已就绪!");
    }
    @Override
    public void move() {
        super.move();
        autoMove();

    }

}

 

 

 

package Decorator;

public class Client {
    public static void main(String[] args) {
        Car car = new Car();
        car.move();
        
        
        System.out.println("增加新的功能=============");
        FlyDecoratorCar flycar = new FlyDecoratorCar(car);
        flycar.move();
        
        
        System.out.println("增加新的功能=============");
        WaterDecoratorCar watercar = new WaterDecoratorCar(flycar);
        watercar.move();
        
        
        System.out.println("增加新的功能=============");
        AIDecoratorCar AIcar = new AIDecoratorCar(watercar);
        AIcar.move();
    }

}

 

 

技术图片

 

装饰器模式

标签:生成   this   one   ali   protected   pre   ons   基础   sam   

原文地址:https://www.cnblogs.com/tangleiblogs/p/12654215.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!