博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器模式
阅读量:5340 次
发布时间:2019-06-15

本文共 1717 字,大约阅读时间需要 5 分钟。

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(); }}

 

原文出处:

转载于:https://www.cnblogs.com/51life/p/9604835.html

你可能感兴趣的文章
关于CSS的使用方式
查看>>
本地MongoDB服务开启与连接本地以及远程服务器MongoDB服务
查看>>
跨域解决方案之CORS
查看>>
学习RESTFul架构
查看>>
分析语句执行步骤并对排出耗时比较多的语句
查看>>
原生JS轮播-各种效果的极简实现
查看>>
软件工程总结作业---提问回顾与个人总结
查看>>
计数器方法使用?
查看>>
带你全面了解高级 Java 面试中需要掌握的 JVM 知识点
查看>>
sonar结合jenkins
查看>>
解决VS+QT无法生成moc文件的问题
查看>>
AngularJs练习Demo14自定义服务
查看>>
stat filename
查看>>
关于空想X
查看>>
CF1067C Knights 构造
查看>>
[BZOJ2938] 病毒
查看>>
webstorm修改文件,webpack-dev-server不会自动编译刷新
查看>>
Scikit-learn 库的使用
查看>>
CSS: caption-side 属性
查看>>
python 用数组实现队列
查看>>