设计模式之装饰模式

来源:互联网 发布:linux 连接网络命令 编辑:程序博客网 时间:2024/06/06 17:50

简介

装饰模式(Decorator Pattern)是一种常见的模式,动态的给一个对象添加额外的职责。就增加功能来说,装饰模式相比生成子类更加灵活。允许向一个现有的对象添加新的功能,同时又不改变其结构。这种设计模式属于结构型模式,它是作为现有的类的一个包装。

优点:

  1. 装饰类和被装饰类可以独立发展,而不会相互耦合。
  2. 装饰模式是继承关系的一种替代方案。
  3. 装饰模式可以动态的扩展一个实现类的功能。

缺点:多层装饰会使代码复制

类图

Component:抽象构件,一般是抽象类或者是接口,也就是原始对象
ConcreteComponent:具体构件,要装饰就是它
Decorator:装饰角色,一般是一个抽象类或者是接口,在这个抽象类中必然有一个private变量指向Comonent抽象构件。
ConcreteComponent:具体装饰类

例:我们可以一个现有的形状类添加颜色

这里定义一个形状接口,然后两个实现类;再定义一个抽象的装饰以及具体的颜色装饰实现类。

java代码实现

创建Shape接口

public interface Shape {        void draw();    }

Shape的实现类

public class Circle implements Shape {        @Override        public void draw() {            System.out.println("Circle");        }    }
    public class Square implements Shape {        @Override        public void draw() {            System.out.println("Square");        }    }

创建抽象的装饰类ShapeDecorator,并实现Shape接口

public abstract class ShapeDecorator implements Shape {        protected Shape shape;        public ShapeDecorator(Shape shape) {            this.shape = shape;        }        @Override        public void draw() {            shape.draw();        }    }

创建具体的装饰类

    public class ColorShapeDecorator extends ShapeDecorator {        public ColorShapeDecorator(Shape shape) {            super(shape);        }        @Override        public void draw() {            shape.draw();            setColor();        }        public void setColor(){            System.out.println("Red Color");        }    }

场景类

public class Client {        public static void main(String[] args){            Shape circle = new Circle();            circle.draw();            ShapeDecorator colorCircle = new ColorShapeDecorator(new Circle());            colorCircle.draw();            ShapeDecorator colorSquare = new ColorShapeDecorator(new Square());            colorSquare.draw();        }    }

丛结果中可以看出,第一个是没有扩展装饰类打印的信息,后面是装饰类打印的信息。

原创粉丝点击