• 装饰器模式


    1 介绍:

    1.1 概念:装饰器模式允许向一个现有的对象添加新功能,同时又不改变其结构。这种模式创建了一个装饰类,来包装原有的类,在保证方法签名完整的情况下,添加了额外的功能。

    1.2 优缺点:

         优点:装饰类和被装饰类独立发展,互不影响,装饰器模式是继承的一个很好的代替模式,可以很好的扩展一个实现类的功能。

         缺点:多层装饰比较复杂

    2.实现:

    我们创建一个Shape接口和它的两个实现类Circle,Rectangle;然后创建一个实现了Shape接口的装饰抽象类DecoratorShape,并把shape对象作为它的变量,其实就是作为被装饰类。然后创建装饰类RedShapeDecorator继承了DecoratorShape。

    Shape接口:

    public interface Shape {
        void draw();
    }

    Circle类:

    // 被装饰类
    public
    class Circle implements Shape{ public void draw() { System.out.println("circle"); } }

    Rectangle类:

    // 被装饰类
    public
    class Rectangle implements Shape{ public void draw() { System.out.println("rectangle"); } }

    DecoratorShape抽象装饰类:

    /**
     * @author chenyk
     * @date 2018年9月7日
     * 抽象装饰类
     */
    
    public abstract class DecoratorShape implements Shape {
        
        //被装饰的类
        protected Shape decoratedShape;
        
        public DecoratorShape(Shape decoratedShape){
            this.decoratedShape = decoratedShape;
        }
        
        public void draw() {
            decoratedShape.draw();
        }
    
    }

    RedShapeDecorator装饰类:

    public class RedShapeDecorator extends DecoratorShape{
    
        public RedShapeDecorator(Shape decoratedShape) {
            super(decoratedShape);
        }
        
        //在不改变被装饰类原有的方法下,又添加了新的方法
        public void draw(){
            decoratedShape.draw();
            setRedBorder();
        }
    
        //装饰类中额外的功能
        public void setRedBorder(){
            System.out.println("Border color:red");
        }
        
        
    }

    在场景类中运行:

    public class DecoratorClient {
        public static void main(String[] args) {
    // 装饰类包装了被装饰类,在不改变被装饰类的基础上,添加了额外的功能 Shape redCircle
    = new RedShapeDecorator(new Circle()); Shape redRectangle = new RedShapeDecorator(new Rectangle()); redCircle.draw(); redRectangle.draw(); } }

    原文出处:http://www.runoob.com/design-pattern/decorator-pattern.html

  • 相关阅读:
    团队项目冲刺第九天
    团队项目冲刺第八天
    团队项目冲刺第七天
    团队项目冲刺第六天
    vue-cli(vue脚手架)详细教程
    Ocelot+Consul 集群搭建实践
    docker部署net core项目
    nginx配置文件
    条码扫描器
    转载:MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
  • 原文地址:https://www.cnblogs.com/51life/p/9604835.html
Copyright © 2020-2023  润新知