zoukankan      html  css  js  c++  java
  • 装饰器模式

    描述

    装饰器模式的作用是在不改变现有对象的结构的情况下,对其添加新的功能。这种模式创建了一个装饰类,该装饰类继承原有的类,并包装原有的类。

    描述起来很麻烦,下面举个例子:

      假设有个形状接口(shape),下面分别创建长方形类(rectangle)和圆形类(circle)都实现形状接口。下面我要给这两个形状涂上红颜色该怎么办呢?来了啊,装饰器模式就解决了这种状况:创建同样实现了shape接口的抽象装饰类,把shape当成员变量,假设shape有方法a(),呢么装饰类要重写其中的a()方法,并且在重写的方法中默认实现shape.a(),这种操作的目的是为了在继承该抽象类的时候,在不改变shape的结构情况下 ,在a()中添加装饰。

    使用场景:当程序员不想增加更多子类的情况下扩展类

    实例:

    基于上边的例子,我们给出了如下的代码实例:

    //形状接口
    public interface Shape {
       void draw();
    }
    
    //实现形状接口的长方形和圆形类
    public class Rectangle implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Shape: Rectangle");
       }
    }
    
    public class Circle implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Shape: Circle");
       }
    }
    
    
    //实现了shape的抽象装饰器类
    public abstract class ShapeDecorator implements Shape {
       protected Shape decoratedShape;
    
       public ShapeDecorator(Shape decoratedShape){
          this.decoratedShape = decoratedShape;
       }
    
       public void draw(){
          decoratedShape.draw();
       }    
    }
    
    //继承了抽象装饰器类的实体装饰器类
    public class RedShapeDecorator extends ShapeDecorator {
    
       public RedShapeDecorator(Shape decoratedShape) {
          super(decoratedShape);        
       }
    
       @Override
       public void draw() {
          decoratedShape.draw();           
          setRedBorder(decoratedShape);
       }
    
       private void setRedBorder(Shape decoratedShape){
          System.out.println("Border Color: Red");
       }
    }
    
    //演示结果
    public class DecoratorPatternDemo {
       public static void main(String[] args) {
    
          Shape circle = new Circle();
    
          Shape redCircle = new RedShapeDecorator(new Circle());
    
          Shape redRectangle = new RedShapeDecorator(new Rectangle());
          System.out.println("Circle with normal border");
          circle.draw();
    
          System.out.println("
    Circle of red border");
          redCircle.draw();
    
          System.out.println("
    Rectangle of red border");
          redRectangle.draw();
       }
    }
    

    结果输出:

    Circle with normal border
    Shape: Circle
    
    Circle of red border
    Shape: Circle
    Border Color: Red
    
    Rectangle of red border
    Shape: Rectangle
    Border Color: Red
    

    代码来源:特别感谢 菜鸟教程java设计模式之装饰器模式

     
  • 相关阅读:
    jquery 学习(五)
    iOS: 学习笔记, Swift名字空间
    iOS: 学习笔记, Swift与C指针交互(译)
    iOS: 学习笔记, Swift运算符定义
    iOS: 学习笔记, Swift与Objective-C混用总结
    iOS: 学习笔记, Swift与Objective-C混用简明教程(转载)
    股票查询接口: 腾讯
    iOS: 学习笔记, swift扩展
    iOS:Swift界面实例1, 简单界面
    iOS: 学习笔记, 用代码驱动自动布局实例(swift)
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7908567.html
Copyright © 2011-2022 走看看