首页 > 其他分享 >装饰模式(Decorator)

装饰模式(Decorator)

时间:2022-11-25 16:13:16浏览次数:43  
标签:run 对象 car 模式 public new 装饰 Decorator

给某个对象,动态新增功能。

构成:

1、抽象接口:真实对象与装饰对象实现同一个接口。

2、装饰父类:持有一个真实对象的引用,即可为真实对象新增功能。

3、真实对象:被扩展的对象。

4、装饰对象:继承装饰父类,负责添加功能的装饰对象。


 

比如:

 

  我有一个IO输出流,它只能写入字节数据。真实对象:FileOutputStream

  我需要新增传写入对象的功能。则需要一个装饰对象:ObjectOutputStream

  使用起来就是:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(data)));
oos.writeObject(obj);

又比如:

  车车都实现了InCar接口。

  我有一辆普通的车车,它只能在路上跑。真实对象:Car

  我需要新增飞起来的功能,自动驾驶的功能。需要两个装饰对象:FlyCar、AiCar

  使用起来就是:

 AiCar ac = new AiCar(new FlyCar(new Car()));
 ac.ai();

 

例子

抽象角色:

/**
 * Component 抽象角色:真实对象与装饰对象实现同一个接口。
 */
public interface InCAr {
    void run();//车都会跑
}

真实对象:被扩展的对象

class Car implements InCAr{
    @Override
    public void run() {
        System.out.println("平平无奇小车车跑起来了。");
    }
}

装饰角色:持有一个抽象构件的引用,即可新增功能。

class SuperCar implements InCAr{
    private InCAr car;//持有一个抽象构件的引用,即可新增功能。

    public SuperCar(InCAr car) { this.car = car; }

    @Override
    public void run() {
        car.run();
    }
}

装饰对象一:新增飞行功能

具体的装饰类,继承了装饰角色,通过super可调用run方法,即保留了原来的功能,又新增了新的功能。可以在共同方法中实现多重复合。

class FlyCar extends SuperCar{
    public FlyCar(InCAr cAr) {
        super(cAr);
    }
    //新增飞的功能
    public void fly(){
        System.out.println("飞起来了。");
    }

    @Override
    public void run() {//同一个方法支持复合添加功能
        fly();
        super.run();
    }
}

装饰对象二:新增自动驾驶功能

class AiCar extends SuperCar{
    public AiCar(InCAr cAr) {
        super(cAr);
    }
    //新增自动驾驶的功能
    public void ai(){
        System.out.println("Ai操控中。");
    }

    @Override
    public void run() {//同一个方法支持复合添加功能
        ai();
        super.run();
    }
}

测试:

public class CLient {
    public static void main(String[] args) throws Exception {
        //普通的车车
        Car car = new Car();
        car.run();
        System.out.println("--------------------");
//创建一个会飞的车车 FlyCar flyCar = new FlyCar(car); flyCar.fly();//新增方法 System.out.println("--------------------");
flyCar.run();//共同方法,新增飞 System.out.println("--------------------");
//创建一个自动驾驶,且会飞的车 AiCar aiCar = new AiCar(new FlyCar(car)); aiCar.ai();//新增方法
System.out.println("--------------------");
aiCar.run();//共同方法,新增自动驾驶、飞 } }

运行结果:

 

标签:run,对象,car,模式,public,new,装饰,Decorator
From: https://www.cnblogs.com/lurenjia-bky/p/16925473.html

相关文章

  • 【J2me3D系列学习文章之二】(立即模式)构造我们3D世界中的第一个立方体!
    Himi 原创,转载请注明!谢谢。   3D设计的里程碑。     首先介绍构造一个3D立方体需要的步骤:(大概步骤哦)    第一:构造一个立方体的空间顶点    ......
  • 设计模式
    单例模式:确保全局只有一个该类的实例预加载:占用内存,将类的实例化私有,在类中声明一个静态的实例。外部可以直接调用。懒加载:无需占用内存,将类的实例化私有,且在类中创建一......
  • 路由器有 4 种运行模式,
    如上图所示,路由器有4种运行模式,第一种运作模式为桥接(bridge)模式,此模式可用于扩大原有AP点的覆盖范围,延长无线通信距离,使用此模式时请关闭7628N路由器的DHCP。第二种......
  • 桥接模式(Bridge)
    一个类中有两个可以扩展的组件,需要扩展的时候会很麻烦,通过桥接接口,把其中一个组件独立出去。应用场景:一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。如果......
  • docker-compose之redis cluster模式
    一、docker容器化的rediscluster最难搞的就是网络问题,这边记录一下集群搭建过程。二、dockerfileFROMredis:5.0.14MAINTAINERxbdRUNln-sf/usr/share/zo......
  • 【Linux】linux | CentOS7 | 命令行模式 | 图形化界面模式
    1、图形化界面->命令行1)键盘按键Ctrl+Alt+F32、命令行->图形化界面1)键入命令init5......
  • 聊一聊装饰者模式
    是你,还是你,一切都有你!——装饰者模式一、概述装饰者模式(DecoratorPattern)允许向一个现有的对象扩展新的功能,同时不改变其结构。主要解决直接继承下因功能的不断横向......
  • 代理模式(Proxy)
    代理模式指的是:为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。 使用场景:1、安全代理:屏蔽对真实角色的直接访问。2、远程代理:通过代理类处理远程方法......
  • 桥接模式javac++
    [实验任务一]:两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。     packagetest9;publicclassBusi......
  • 组合模式java+c++
    [实验任务一]:组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。    packagetest10;publicabstractclassAbstractFile{publicabstrac......