`
rich8w
  • 浏览: 180702 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

03_DecoratorPattern 小菜扮靓

阅读更多
大话设计模式本章内容摘录语句:
装饰这词真好,无论衣服、鞋子、领带、披风其实都可以理解为对人的装饰。
一旦使用装饰模式,不仅要实例化组件,还要把此组件包装进装饰者中
如果只有一个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),再把该装饰对象包装进装饰者中,接着再在装饰者中层层嵌套的
	 */
}
0
0
分享到:
评论

相关推荐

    Python库 | json_log_decorator-2.0.0.tar.gz

    《Python库解析:json_log_decorator-2.0.0》 在编程领域,尤其是Python社区,库是开发者的重要工具,它们提供了预定义的功能,帮助我们更高效地编写代码。今天我们要探讨的是一个名为`json_log_decorator`的Python...

    java_Decorator.rar_decorator_decorator java

    *Decorator 常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator 模式中是必须的。

    PyPI 官网下载 | protocol_implements_decorator-0.3.1.tar.gz

    标题中的"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

    **PyPI 官网下载 | cache_decorator-1.1.9.tar.gz** `cache_decorator-1.1.9.tar.gz` 是一个源自Python Package Index (PyPI) 的压缩包文件,其中包含了一个名为 `cache_decorator` 的Python库的源代码。PyPI是...

    timeout_decorator.py

    windows系统下的python超时装饰器,解决pypi中timeout-decorator库在windows系统上不可用的问题。

    time_decorator.py

    time_decorator.py

    PyPI 官网下载 | config_decorator-2.0.10-py3-none-any.whl

    《PyPI官网下载:深入理解config_decorator-2.0.10-py3-none-any.whl》 在Python的世界里,PyPI(Python Package Index)是开发者们分享和获取Python软件包的重要平台。今天我们将深入探讨一个在PyPI上发布的特定...

    20-装饰器使用_Decorator.ts

    20-装饰器使用_Decorator

    Python库 | drf_nested_decorator-0.3-py2-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:drf_nested_decorator-0.3-py2-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    timeout-decorator:Python的超时装饰器

    超时装饰器安装从源代码: 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

    "seromarin_decorator_pattern" 可能是一个关于如何在 TypeScript 中应用装饰器模式的示例项目。 装饰器在 TypeScript 中以 `@decorator` 的形式存在,它们本质上是函数,可以接收一个类、属性、方法或参数的元数据...

    Python库 | potemkin_decorator-0.0.7-py3-none-any.whl

    "potemkin_decorator-0.0.7-py3-none-any.whl" 是一个与Python相关的库,名为“Potemkin Decorator”,版本号为0.0.7。这个库是为Python3设计的,支持多种平台,其主要功能是提供装饰器(Decorator)功能。 装饰器...

    Python库 | sso_client_decorator-0.0.19-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:sso_client_decorator-0.0.19-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    Python库 | cache_decorator-1.2.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:cache_decorator-1.2.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

Global site tag (gtag.js) - Google Analytics