欢迎来到Vincentyw的博客

该来的终究会来,该走的也一定会离开。凡事都存在前因后果,因缘成熟了,果报便产生了,无法阻挡。
但是发生过了就会消失,有来就有走,一切都是过客,把握自己当下的因缘,承担起自己该承担的责任,做好眼前该做的事情,做的时候尽全力,过去便放下,放下即自在。

设计模式之装饰器模式

Decorator(装饰器模式)

一、装饰器模式简介

装饰器模式(Decorator)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

核心:

  • 1、动态地给一个对象添加一些额外的职责
  • 2、防止使用继承扩展造成的子类膨胀
  • 3、将具体功能职责划分,同时继承装饰者模式

二、组合模式优缺点比较

优点:

  • 1、装饰类和被装饰类可以独立发展,不会相互耦合
  • 2、扩展灵活,不会导致类个数急剧增加
  • 3、可以多次装饰构件不同功能的对象,使之功能强大

缺点:

  • 1、多层装饰比较复杂
  • 2、产生很多小对象,占用内存,一定程度上影响性能

使用场景:

  • 1、IO中输入流和输出流的设计
  • 2、Swing包中图形界面构件功能
  • 3、HttpServletRequestWrapper,HttpServletRequestWrapper 类,增强了request对象的功能

注意事项:代替继承

三、UML类图实现

四、实现

   步骤1:创建抽象构件接口

//Component抽象构件角色
public interface ICar {
    public void run();
}

 步骤2:创建实现抽象接口的真实对象

//ConcreteComponent 具体构件角色(真实对象)
public class AudiCar implements ICar{
    @Override
    public void run() {
        System.out.println("奥迪在陆地上运行");
    }
}

步骤3:创建实现抽象接口的装饰器

//Decorator装饰角色
public class CarDecorator implements ICar {
    
    protected ICar car;

    public CarDecorator(ICar car) {
        this.car = car;
    }

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

步骤4:创建具体装饰对象

//ConcreteDecorator具体装饰角色
public class AICarDecorator extends CarDecorator {

    public AICarDecorator(ICar car) {
        super(car);
    }
    
    public void run() {
        car.run();
        move();
    }
    
    public void move() {
        System.out.println("车可以自动驾驶运行!");
    }

}

public class FlyCarDecorator extends CarDecorator {

    public FlyCarDecorator(ICar car) {
        super(car);
    }
    
    public void run() {
        car.run();
        fly();
    }
    
    public void fly() {
        System.out.println("车可以飞");
    }

}

步骤5:调用者测试

public class DecoratorDemo01 {   
    public static void main(String[] args) {
        ICar car = new AudiCar();
        car.run();
        
        System.out.println("增加性能,车可以飞");
        ICar fly = new FlyCarDecorator(car);
        fly.run();
        
        System.out.println("增加性能,车可以自动行驶");
        ICar aiCar = new AICarDecorator(car);
        aiCar.run();
        
        System.out.println("增加性能,飞和自动行驶");
        ICar topCar = new AICarDecorator(fly);
        topCar.run();
    }

}

步骤6:运行程序,观察结果

 

posted on 2020-04-04 22:37  VincentYew  阅读(245)  评论(0)    收藏  举报

导航