- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构
装饰器模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能
装饰器模式属于结构型模式,它是作为现有的类的一个包装
1、 意图:
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活
2、 主要解决:
一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀
3、 何时使用:
在不想增加很多子类的情况下扩展类
4、 如何解决:
将具体功能职责划分,同时继承装饰者模式
5、 关键代码:
1、 Component类充当抽象角色,不应该具体实现;
2、 修饰类引用和继承Component类,具体扩展类重写父类方法;
6、 应用实例:
1、 孙悟空有72变,当他变成”庙宇”后,他的根本还是一只猴子,但是他又有了庙宇的功能;
2、 不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体;
7、 优点:
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
8、 缺点:
多层装饰比较复杂
9、 使用场景:
1、 扩展一个类的功能;
2、 动态增加功能,动态撤销;
10、 注意事项:
可代替继承
1、 创建一个Shape接口和实现了Shape接口的实体类;
2、 创建一个实现了Shape接口的抽象装饰类ShapeDecorator,并把Shape对象作为它的实例变量;
3、 创建类RedShapeDecorator实现了ShapeDecorator实体类;
4、 创建类DecoratorPatternDemo使用RedShapeDecorator来装饰Shape对象;
我们通过下面的范例来演示装饰器模式的用法,其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类
Shape.java
// author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
// Copyright © 2015-2065 ddkk.com. All rights reserved.
package com.ddkk.gof;
public interface Shape {
void draw();
}
Rectangle.java
// author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
// Copyright © 2015-2065 ddkk.com. All rights reserved.
package com.ddkk.gof;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
Circle.java
// author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
// Copyright © 2015-2065 ddkk.com. All rights reserved.
package com.ddkk.gof;
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
ShapeDecorator.java
// author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
// Copyright © 2015-2065 ddkk.com. All rights reserved.
package com.ddkk.gof;
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
RedShapeDecorator.java
// author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
// Copyright © 2015-2065 ddkk.com. All rights reserved.
package com.ddkk.gof;
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");
}
}
DecoratorPatternDemo.java
// author: DDKK.COM 弟弟快看,程序员编程资料站(ddkk.com)
// Copyright © 2015-2065 ddkk.com. All rights reserved.
package com.ddkk.gof;
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("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
编译运行以上 Java 范例,输出结果如下
$ javac -d . src/main/com.ddkk/gof/DecoratorPatternDemo.java
$ java com.ddkk.gof.DecoratorPatternDemo
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 2 年前。 Improve this ques
运行 jscodeshift -t ./react-codemod/transforms/React-PropTypes-to-prop-types.js ./src 时出现以下错误 Transfor
尝试将带有 vuex-module-decorators 的存储模块加载到初始化程序中时出现此错误: vuex.esm.js?2f62:261 Uncaught TypeError: Cannot r
我在 JBoss AS 7.1.0.Final 上运行的 ear 应用程序由两个 jar 组成: lib/one.jar lib/two.jar 两个 jar 都是 CDI bean 文件。 two.
我想使用两种类型的装饰器: 一) @new def foo(): print("foo") b) @new(arg1, arg2, arg3, ...) def bar(): prin
所以我在这里试图实现的是,我不希望任何超链接带有下划线,同时我希望某些元素被删除。 他们两个单独工作都很好,但我不能同时工作。 代码: a:link { text-decoration:
Env: Wildfly 9.0.1 Weld 2.2.14 我目前正在研究在合理的情况下在我们的遗留代码库中使用 CDI @Decorator 的可能性。 查看规范和 java ee 7
在 JavaScript 函数中,接收函数、修改行为并返回该函数的似乎是装饰器。例如,这将是一个装饰器函数: function doubleDec (func){ return functio
我正在升级到 Babel 7,虽然应用程序正在加载,但我的测试出现了问题。他们以前很好。我从涉及装饰组件的每个测试中都收到此错误。 FAIL src/app/components/pages/Ho
在运行 pip install InstagramAPI 时,我有 2 个错误,我还没有设法修复。 我遇到的第一个错误是 "networkx 2.1 has requirement decorator
我试图做一个装饰器来包装协程或函数。 我尝试的第一件事是在包装器中编写一个简单的重复代码: def duration(func): @functools.wraps(func) def
我有一个非常简单的函数,定义为 def test(x): return x 我想用装饰器包装它,它返回一个需要另一个 kwargs 参数的函数。 @simple_dec def test(x):
我想将我正在使用的 API 分为两个部分:“基本”和“轻松”。这个想法是,'cushy' 部分中的所有方法调用都可以用 'bare-bones' 部分中的方法来表示,也就是说,它们将只作为快速和肮脏的
为什么这不会从 this page 上的 facebook 和刺客行业链接中删除下划线| . .module_wpproad { text-decoration:none; border:none;
为什么这不会从 this page 上的 facebook 和刺客行业链接中删除下划线| . .module_wpproad { text-decoration:none; border:none;
注意:我问的不是常见的 python 装饰器,而是装饰器设计模式。 我想写一个装饰器来修改具体组件调用的函数,下面的代码示例说明了我的问题: In [2]: class Animal: ...:
我有一个类主要提供用于连接存储在字典中的数据的属性。每个属性(通常)负责字典中的一个键,但字典中可能还有其他键,这些键不受属性管理。 编辑 3:澄清一下,因为评论中有些困惑: I have an ar
我在 Django View 上有这个错误: TypeError at /web/host/1/ decorator() got an unexpected keyword argument 'hos
出于调试目的,我想打印出与在 python 方法中执行的每一行有关的内容。 例如,如果行中有一些赋值,我想打印为该变量赋值的值,如果有函数调用,我想打印出函数返回的值,等等。 因此,例如,如果我要使用
装饰模式是一种经典的类功能扩展模式,其精髓在装饰类使用继承加聚合的方式获得接口和要实现对象,然后通过自己实现扩展接口 作用 装饰模式通过装饰类动态地将责任附加到对象上,若要扩展功能,无需通过继承增
我是一名优秀的程序员,十分优秀!