
装饰模式的核心实现:
1.抽象组件(Component):具体类和装饰类基本功能规范,通过二者的实现,可以通过多态方式互为引用。
2.具体组件(Concrete Component):抽象组件的具体实现类。
3.抽象装饰(Decorator):继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
4.具体装饰(ConcreteDecorator):实现抽象装饰的相关方法,并给具体构件对象添加附加的功能。

下面以实例说明实现过程:
智能手机除了基本功能外,还可以给手机加个保护壳、增加红外线遥控空调的功能、投影仪功能,还可以三者任意组合兼有之,我们用装饰模式实现。
UML类图:

详细代码:
package com.mosang.Decoration;
public interface SmartPhone {
public void weChat();//智能手机基本功能:发微信
package com.mosang.Decoration;
/**
* Component
* 抽象组件:“智能手机”接口
* @author Heiry
*
*/
public interface SmartPhone {
public void weChat();//智能手机基本功能:发微信
}
package com.mosang.Decoration;
/**
* Component
* 抽象组件:“智能手机”接口
* @author Heiry
*
*/
public interface SmartPhone {
public void weChat();//智能手机基本功能:发微信
}
package com.mosang.Decoration;
* 具体组件类:具体一款手机:“陌桑超级智能手机”,实现“智能手机”接口
public class MosangSuperPhone implements SmartPhone {
System.out.println("愉快聊微信中。。。。");
package com.mosang.Decoration;
/**
* ConcreteComponent
* 具体组件类:具体一款手机:“陌桑超级智能手机”,实现“智能手机”接口
* @author Heiry
*
*/
public class MosangSuperPhone implements SmartPhone {
//重写weChat方法
@Override
public void weChat() {
System.out.println("愉快聊微信中。。。。");
}
}
package com.mosang.Decoration;
/**
* ConcreteComponent
* 具体组件类:具体一款手机:“陌桑超级智能手机”,实现“智能手机”接口
* @author Heiry
*
*/
public class MosangSuperPhone implements SmartPhone {
//重写weChat方法
@Override
public void weChat() {
System.out.println("愉快聊微信中。。。。");
}
}
package com.mosang.Decoration;
public class Projector extends Decorator {
public Projector(SmartPhone phone) {
super.weChat(); // 具体组件的功能
this.projection(); //增加投影功能
private void projection() {
System.out.println("我有了投影功能,手机也能看大幕电影了。。。。");
package com.mosang.Decoration;
/**
* ConcreteDecorator
* 具体装饰类:实现投影功能
* @author Heiry
*
*/
public class Projector extends Decorator {
//构造方法
public Projector(SmartPhone phone) {
super(phone);
}
//重写父类方法
@Override
public void weChat() {
super.weChat(); // 具体组件的功能
this.projection(); //增加投影功能
}
private void projection() {
System.out.println("我有了投影功能,手机也能看大幕电影了。。。。");
}
}
package com.mosang.Decoration;
/**
* ConcreteDecorator
* 具体装饰类:实现投影功能
* @author Heiry
*
*/
public class Projector extends Decorator {
//构造方法
public Projector(SmartPhone phone) {
super(phone);
}
//重写父类方法
@Override
public void weChat() {
super.weChat(); // 具体组件的功能
this.projection(); //增加投影功能
}
private void projection() {
System.out.println("我有了投影功能,手机也能看大幕电影了。。。。");
}
}
package com.mosang.Decoration;
public class ProtectShell extends Decorator {
public ProtectShell(SmartPhone phone) {
private void protectPhone() {
System.out.println("使用前给手机加了个保护壳,美美哒。。。");
package com.mosang.Decoration;
/**
* ConcreteDecorator
* 具体装饰类:实现使用前给手机加个保护壳功能
* @author Heiry
*
*/
public class ProtectShell extends Decorator {
public ProtectShell(SmartPhone phone) {
super(phone);
}
@Override
public void weChat() {
this.protectPhone();
super.weChat();
}
private void protectPhone() {
System.out.println("使用前给手机加了个保护壳,美美哒。。。");
}
}
package com.mosang.Decoration;
/**
* ConcreteDecorator
* 具体装饰类:实现使用前给手机加个保护壳功能
* @author Heiry
*
*/
public class ProtectShell extends Decorator {
public ProtectShell(SmartPhone phone) {
super(phone);
}
@Override
public void weChat() {
this.protectPhone();
super.weChat();
}
private void protectPhone() {
System.out.println("使用前给手机加了个保护壳,美美哒。。。");
}
}
package com.mosang.Decoration;
public class Infrared extends Decorator {
public Infrared(SmartPhone phone) {
super.weChat(); // 具体组件的功能实现
this.remoteControl(); //增加红外遥控功能
public void remoteControl(){
System.out.println("我有了红外线,遥控空调中。。。。");
package com.mosang.Decoration;
/**
* ConcreteDecorator
* 具体装饰组类:实现红外功能
* @author Heiry
*
*/
public class Infrared extends Decorator {
//构造方法
public Infrared(SmartPhone phone) {
super(phone);
}
@Override
public void weChat() {
super.weChat(); // 具体组件的功能实现
this.remoteControl(); //增加红外遥控功能
}
public void remoteControl(){
System.out.println("我有了红外线,遥控空调中。。。。");
}
}
package com.mosang.Decoration;
/**
* ConcreteDecorator
* 具体装饰组类:实现红外功能
* @author Heiry
*
*/
public class Infrared extends Decorator {
//构造方法
public Infrared(SmartPhone phone) {
super(phone);
}
@Override
public void weChat() {
super.weChat(); // 具体组件的功能实现
this.remoteControl(); //增加红外遥控功能
}
public void remoteControl(){
System.out.println("我有了红外线,遥控空调中。。。。");
}
}
package com.mosang.Decoration;
public static void main(String[] args) {
MosangSuperPhone myphone = new MosangSuperPhone();//创建陌桑超级手机实例
ProtectShell shell = new ProtectShell(myphone); // 给手机加外壳
shell.weChat(); //使用手机(聊微信)前,先给手机加壳
System.out.println("--------------------------");
Infrared infrared = new Infrared(myphone);
infrared.weChat(); // 手机试用(聊微信)后,调出遥控空调功能
System.out.println("--------------------------");
Projector projector = new Projector(myphone);
projector.weChat();// 手机试用(聊微信)后,调出投影功能
System.out.println("--------------------------");
Projector multiPhone = new Projector(shell);
multiPhone.weChat(); // 既装了手机壳,又有了投影功能
System.out.println("--------------------------");
//使手机既加了保护壳,又能投影看电影,还能红外遥控空调
Infrared multiPhone2 = new Infrared(multiPhone);
package com.mosang.Decoration;
/**
* 客户端测试类
* @author Heiry
*
*/
public class Clinet {
public static void main(String[] args) {
MosangSuperPhone myphone = new MosangSuperPhone();//创建陌桑超级手机实例
ProtectShell shell = new ProtectShell(myphone); // 给手机加外壳
shell.weChat(); //使用手机(聊微信)前,先给手机加壳
System.out.println("--------------------------");
Infrared infrared = new Infrared(myphone);
infrared.weChat(); // 手机试用(聊微信)后,调出遥控空调功能
System.out.println("--------------------------");
Projector projector = new Projector(myphone);
projector.weChat();// 手机试用(聊微信)后,调出投影功能
System.out.println("--------------------------");
//使手机既加了保护壳,又能投影看电影
Projector multiPhone = new Projector(shell);
multiPhone.weChat(); // 既装了手机壳,又有了投影功能
System.out.println("--------------------------");
//使手机既加了保护壳,又能投影看电影,还能红外遥控空调
Infrared multiPhone2 = new Infrared(multiPhone);
multiPhone2.weChat();
}
}
package com.mosang.Decoration;
/**
* 客户端测试类
* @author Heiry
*
*/
public class Clinet {
public static void main(String[] args) {
MosangSuperPhone myphone = new MosangSuperPhone();//创建陌桑超级手机实例
ProtectShell shell = new ProtectShell(myphone); // 给手机加外壳
shell.weChat(); //使用手机(聊微信)前,先给手机加壳
System.out.println("--------------------------");
Infrared infrared = new Infrared(myphone);
infrared.weChat(); // 手机试用(聊微信)后,调出遥控空调功能
System.out.println("--------------------------");
Projector projector = new Projector(myphone);
projector.weChat();// 手机试用(聊微信)后,调出投影功能
System.out.println("--------------------------");
//使手机既加了保护壳,又能投影看电影
Projector multiPhone = new Projector(shell);
multiPhone.weChat(); // 既装了手机壳,又有了投影功能
System.out.println("--------------------------");
//使手机既加了保护壳,又能投影看电影,还能红外遥控空调
Infrared multiPhone2 = new Infrared(multiPhone);
multiPhone2.weChat();
}
}
运行结果:
--------------------------
--------------------------
--------------------------
--------------------------
使用前给手机加了个保护壳,美美哒。。。
愉快聊微信中。。。。
--------------------------
愉快聊微信中。。。。
我有了红外线,遥控空调中。。。。
--------------------------
愉快聊微信中。。。。
我有了投影功能,手机也能看大幕电影了。。。。
--------------------------
使用前给手机加了个保护壳,美美哒。。。
愉快聊微信中。。。。
我有了投影功能,手机也能看大幕电影了。。。。
--------------------------
使用前给手机加了个保护壳,美美哒。。。
愉快聊微信中。。。。
我有了投影功能,手机也能看大幕电影了。。。。
我有了红外线,遥控空调中。。。。
使用前给手机加了个保护壳,美美哒。。。
愉快聊微信中。。。。
--------------------------
愉快聊微信中。。。。
我有了红外线,遥控空调中。。。。
--------------------------
愉快聊微信中。。。。
我有了投影功能,手机也能看大幕电影了。。。。
--------------------------
使用前给手机加了个保护壳,美美哒。。。
愉快聊微信中。。。。
我有了投影功能,手机也能看大幕电影了。。。。
--------------------------
使用前给手机加了个保护壳,美美哒。。。
愉快聊微信中。。。。
我有了投影功能,手机也能看大幕电影了。。。。
我有了红外线,遥控空调中。。。。
可见,比起直接继承实现新增功能,装饰模式极好实现了功能叠加,更好地提高了代码重用。