大话设计模式本章内容摘录语句:
装饰这词真好,无论衣服、鞋子、领带、披风其实都可以理解为对人的装饰。
一旦使用装饰模式,不仅要
实例化组件,还要
把此组件包装进装饰者中。
如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以使ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么久没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。
Person具体组件类(装饰对象或装饰源)
package cn;
public class Person {
private String name;
public Person(){
}
public Person(String name) {
super();
this.name = name;
}
//Operation
public void show(){
System.out.print(name+"\t");
}
}
Decorator装饰基类
package cn.impl;
import cn.Person;
public class Decorator extends Person{
public Decorator(){
//这个用来new的无参构造,方便生成对象后使用方法装饰
}
//通过构造函数装饰
public Decorator(Person person){
this.person=person;
}
protected Person person;
//通过方法装饰
public void decorate(Person person) {
this.person=person;
}
@Override
/**
* 这是关键!
* 继承的子类,必须要运行super.show();来确保能装饰到。
* 这相当于对原来的person进行了装饰。
*/
public void show() {
person.show();
}
}
Glove护手装饰类
package cn.impl;
import cn.Person;
public class Glove extends Decorator{
public Glove(){
}
public Glove(Person person){
super(person);
}
@Override
public void show(){
super.show();//此句必加,否则无法装饰其他装饰者或具体装饰对象
newBehavior();
System.out.print("野蛮角斗士的鬼纹手套 ");
}
//新的方法
private void newBehavior(){
System.out.print("");
}
}
Helmet护帽装饰类
package cn.impl;
import cn.Person;
public class Helmet extends Decorator {
public Helmet(){
}
public Helmet(Person person){
super(person);
}
@Override
public void show() {
super.show();
System.out.println("野蛮角斗士的鬼纹软帽 ");
}
}
Robe长袍装饰类
package cn.impl;
import cn.Person;
public class Robe extends Decorator {
public Robe(){
}
public Robe(Person person){
super(person);
}
@Override
public void show() {
super.show();
System.out.print("野蛮角斗士的鬼纹长袍 ");
}
}
ShinPad护腿装饰类
package cn.impl;
import cn.Person;
public class ShinPad extends Decorator {
public ShinPad(){
}
public ShinPad(Person person){
super(person);
}
@Override
public void show() {
super.show();
System.out.print("野蛮角斗士的鬼纹护腿 ");
}
}
ShoulderPad护肩装饰类
package cn.impl;
import cn.Person;
public class ShoulderPad extends Decorator{
//可增加的属性
private String newInfo="老鼠咬过的";
public ShoulderPad(){
}
public ShoulderPad(Person person){
super(person);
}
@Override
public void show() {
super.show();
System.out.print(newInfo+"野蛮角斗士的鬼纹护肩 ");
}
}
Test_Decorator测试类
package junit.test;
import org.junit.Test;
import cn.Person;
import cn.impl.Decorator;
import cn.impl.Glove;
import cn.impl.Helmet;
import cn.impl.Robe;
import cn.impl.ShinPad;
import cn.impl.ShoulderPad;
public class Test_Decorator {
//通过方法产生
@Test public void test(){
Person person = new Person("Tom");//具体装饰对象
Decorator d1 = new Glove(); //装饰者1
d1.decorate(person); //把装饰对象包装入装饰者1
Decorator d2 = new Robe(); //装饰者2
d2.decorate(d1); //把包装者1包装入包装者2(递归包装)
d1 = new Helmet(); //合理再利用装饰者1
d1.decorate(d2);
d1.show(); //包装
System.out.println();
}
//通过带参构造函数
@Test public void test1(){
Person person = new Person("Jerry");//具体装饰对象
//写法1
Decorator d1 = new ShinPad(person); //通过构造函数来把装饰对象装入装饰者1
d1 = new Glove(d1); //...............装饰者1装入装饰者2
d1.show();
System.out.println();
//写法2
Decorator d2 = new ShoulderPad(new Robe(person));
d2.show();
System.out.println();
}
/**
* 注:两种方式都是 先实例化装饰对象(Person),再把该装饰对象包装进装饰者中,接着再在装饰者中层层嵌套的
*/
}
分享到:
相关推荐
《Python库解析:json_log_decorator-2.0.0》 在编程领域,尤其是Python社区,库是开发者的重要工具,它们提供了预定义的功能,帮助我们更高效地编写代码。今天我们要探讨的是一个名为`json_log_decorator`的Python...
*Decorator 常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator 模式中是必须的。
标题中的"PyPI 官网下载 | protocol_implements_decorator-0.3.1.tar.gz"表明这是一个在Python Package Index(PyPI)上发布的软件包,名为`protocol_implements_decorator`,版本为0.3.1,且以tar.gz格式打包。...
**PyPI 官网下载 | cache_decorator-1.1.9.tar.gz** `cache_decorator-1.1.9.tar.gz` 是一个源自Python Package Index (PyPI) 的压缩包文件,其中包含了一个名为 `cache_decorator` 的Python库的源代码。PyPI是...
windows系统下的python超时装饰器,解决pypi中timeout-decorator库在windows系统上不可用的问题。
time_decorator.py
《PyPI官网下载:深入理解config_decorator-2.0.10-py3-none-any.whl》 在Python的世界里,PyPI(Python Package Index)是开发者们分享和获取Python软件包的重要平台。今天我们将深入探讨一个在PyPI上发布的特定...
20-装饰器使用_Decorator
资源分类:Python库 所属语言:Python 资源全名:drf_nested_decorator-0.3-py2-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
超时装饰器安装从源代码: python setup.py install从pypi: pip install timeout-decorator用法import timeimport timeout_decorator@timeout_decorator.timeout(5)def mytest(): print("Start") for i in range(1,...
"seromarin_decorator_pattern" 可能是一个关于如何在 TypeScript 中应用装饰器模式的示例项目。 装饰器在 TypeScript 中以 `@decorator` 的形式存在,它们本质上是函数,可以接收一个类、属性、方法或参数的元数据...
"potemkin_decorator-0.0.7-py3-none-any.whl" 是一个与Python相关的库,名为“Potemkin Decorator”,版本号为0.0.7。这个库是为Python3设计的,支持多种平台,其主要功能是提供装饰器(Decorator)功能。 装饰器...
资源分类:Python库 所属语言:Python 资源全名:sso_client_decorator-0.0.19-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...
资源分类:Python库 所属语言:Python 资源全名:cache_decorator-1.2.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059