03_DecoratorPattern 小菜扮靓

本文通过一个具体的例子展示了装饰模式的应用,包括定义具体组件类、装饰基类及多种装饰类,并通过测试类验证了装饰模式的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大话设计模式本章内容摘录语句:
装饰这词真好,无论衣服、鞋子、领带、披风其实都可以理解为对人的装饰。
一旦使用装饰模式,不仅要[b]实例化组件[/b],还要[b]把此组件包装进装饰者中[/b]。
如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以使ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么久没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。


[color=blue]Person具体组件类(装饰对象或装饰源)[/color]

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



[color=blue]Decorator装饰基类[/color]

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

}



[color=blue]Glove护手装饰类[/color]

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



[color=blue]Helmet护帽装饰类[/color]

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("野蛮角斗士的鬼纹软帽 ");
}


}



[color=blue]Robe长袍装饰类[/color]

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("野蛮角斗士的鬼纹长袍 ");
}
}



[color=blue]ShinPad护腿装饰类[/color]

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("野蛮角斗士的鬼纹护腿 ");
}


}



[color=blue]ShoulderPad护肩装饰类[/color]

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+"野蛮角斗士的鬼纹护肩 ");
}


}



[color=blue]Test_Decorator测试类[/color]

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),再把该装饰对象包装进装饰者中,接着再在装饰者中层层嵌套的
*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值