装饰模式:(Decorator)在不改动原有类文件并且不使用继承的前提下动态的给一个对象添加一些额外的职责。
优点:A、把类的装饰功能从类中搬离出去,简化原有的类。B、有效的把类的核心职责个装饰分离开来,而且可以除去相关类中重复的装饰逻辑
装饰模式的特点:
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就可以以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的索引(reference)
(3) 装饰对象接受所有的来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
//~Person.java
public class Person {
private String name;
public Person() {
// TODO Auto-generated constructor stub
}
public Person(String name) {
// TODO Auto-generated constructor stub
this.name = name;
}
public void show() {
System.out.println("装扮的-" + name);
}
}
//---------------------------------------------------------------------------------------
|
|
|
//~Finery.java
public class Finery extends Person {
public Finery() {
// TODO Auto-generated constructor stub
}
public Finery(String name) {
super(name);
// TODO Auto-generated constructor stub
}
protected Person component;
public void decorate(Person component) {
this.component = component;
}
@Override
public void show() {
// TODO Auto-generated method stub
if (this.component != null) {
this.component.show();
}
}
}
//---------------------------------------------------------------------------------------
|
|
//~TShirts.java
public class TShirts extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("大T恤 ");
super.show();
}
}
//---------------------------------------------------------------------------------------
|
|
|
//~Tie.java
public class Tie extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("打领带 ");
super.show();
}
}
//---------------------------------------------------------------------------------------
|
|
//~Suit.java
public class Suit extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("穿西服 ");
super.show();
}
}
//---------------------------------------------------------------------------------------
|
|
|
//~Sneakers.java
public class Sneakers extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("运动鞋 ");
super.show();
}
}
//---------------------------------------------------------------------------------------
|
|
//~LeatherShoes.java
public class LeatherShoes extends Finery {
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("皮鞋 ");
super.show();
}
}
//---------------------------------------------------------------------------------------
|
|
|
//~BigTrouser.java
public class BigTrouser extends Finery{
@Override
public void show() {
// TODO Auto-generated method stub
System.out.print("大牛仔裤 ");
super.show();
}
}
//---------------------------------------------------------------------------------------
|
|
//~Client.java
public class Client {
public static void main(String[] args) {
Person person = new Person("小菜");//这是赤身裸体的-小菜
System.out.println("{dy}种装扮:");
Sneakers sneakerA = new Sneakers();
BigTrouser bigTrouserA = new BigTrouser();
LeatherShoes leatherShoeA = new LeatherShoes();
sneakerA.decorate(person);//裸体的小菜正在穿运动鞋
bigTrouserA.decorate(sneakerA);//穿了运动鞋的小菜正在传大牛仔裤
leatherShoeA.decorate(bigTrouserA);//穿运动鞋和牛仔裤的小菜真正穿皮鞋
leatherShoeA.show();//小菜出来了
System.out.println("第二种装扮:");
Tie tieB = new Tie();
LeatherShoes leatherShoeB = new LeatherShoes();
Suit suitB = new Suit();
tieB.decorate(person);//裸体的小菜正在打领带
leatherShoeB.decorate(tieB);//打了领带的小菜正在穿皮鞋
suitB.decorate(leatherShoeB);//打了领带穿了皮鞋的小菜真正穿西服
suitB.show();//小菜出来了
}
}
|
|
|
|