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

    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

  • 相关阅读:
    使用VisualVM进行性能分析及调优(转)
    Eclipse插件开发中对于Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)(转)
    Adapter 代码中启动报错
    Myeclipse安装SVN插件(转)
    用java程序调用批处理文件
    内存泄露及常见的解决办法(转)
    Adapter 启动时报错——2
    开启Win7系统管理员Administrator账户
    C盘更改文件夹权限
    Adapter 启动时报错
  • 原文地址:https://www.cnblogs.com/51life/p/9604835.html
Copyright © 2011-2022 走看看