zoukankan      html  css  js  c++  java
  • 23种设计模式之装饰器模式

    装饰器模式主要有以下元素:

    1.Component为统一接口,也是装饰类和被装饰类的基本类型。
    2.ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。
    3.Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。
    4.ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。

    以上4点可以说是设计装饰器模式需要的条件及思路。

    优点:

    装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

    案列:

      /*
     1.装饰器模式-compoment接口
      */
      public interface Icar {
          void move();
      }

    /*
    2.装饰器模式-ConcreteComponent具体构建角色(真实对象)
    被装饰类 角色
    */
    class Car implements Icar {
    @Override
    public void move() {
    System.out.println("陆地上跑");
    }
    }
    /**
    *3. Decorator 装饰类 实现接口并内部维护一个ConcreteComponent实例(被装饰类)
    */
    class SuperCar implements Icar {
    private Icar car;
    public SuperCar(Icar car){
    this.car=car;
    }
    @Override
    public void move() {
    car.move();
    }
    }
    4.//ConcreteDecorator具体装饰角色
    class FlyCar extends SuperCar{

    public FlyCar(Icar car) {
    super(car);
    }
    public void fly(){
    System.out.println("天上飞");
    }

    @Override
    public void move() {
    super.move();
    fly();
    }
    }

    4.//ConcreteDecorator具体装饰角色
    class WaterCar extends SuperCar{

    public WaterCar(Icar car) {
    super(car);
    }
    public void swim(){
    System.out.println("水里游");
    }

    @Override
    public void move() {
    super.move();
    swim();
    }
    }
    5.测试
    public class Test{
    public static void main(String[] args){
    Icar car=new Car();
    car.move();

    System.out.println("-----增加新功能(装饰效果)");
    Icar flycar=new FlyCar(car);
    flycar.move();

    System.out.println("-----增加新功能(装饰效果)");
    Icar watercar=new WaterCar(car);
    watercar.move();

    System.out.println("-----增加2个新功能(装饰效果)");
    Icar watercar2=new WaterCar(flycar);
    watercar2.move();

    }
    }
     
     
     
  • 相关阅读:
    照到抄的。C# 多线程自己写的包装器
    转的一份代码应该是 max的吧..
    WPF 里面的 Run .感觉这名称真没取好,application 里面有个 run, textblock 里面也有个.
    Marshal C#
    VS2010推荐实用插件
    Aga.Controls.Tree.TreeViewAdv使用教程之概要介绍
    文档批量下载器
    有趣,http请求接收网站
    Dictionary, KeayValuePair,HashMap,HashTable,待学补充
    kafka和zookeeper的安装
  • 原文地址:https://www.cnblogs.com/HYV587/p/12664925.html
Copyright © 2011-2022 走看看