Decorator模式(装饰模式),动态地给一个对象加一些额外的职责。每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关系如何被添加到对象链当中。
由用户的样式有感而发
BlueStyle,RedStyle,Content相对User来说是不知道的,Style是具体对象,BlueStyle的可以自由扩展相应的职责,BlueStyle也无需关心RedStyle,Content等。只做好自己的职责。用代码来实现以下。
User类
package com.tankiy.Decoration;
/**
* <p>Title: Decoration(装饰模式)</p>
* @author Tankiy
* @version 1.0
*/
public class User {
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
public void show() {
System.err.println(userName + "的样式:");
}
}
Style
package com.tankiy.Decoration;
/**
* <p>Title: Decoration(装饰模式)</p>
* @author Tankiy
* @version 1.0
*/
public class Style extends User {
private User style;
public void setStyle(User style) {
this.style = style;
}
public void show() {
if(style != null) {
style.show();
}
}
}
RedStyle
package com.tankiy.Decoration;
/**
* <p>Title: Decoration(装饰模式)</p>
* @author Tankiy
* @version 1.0
*/
public class RedStyle extends Style {
public void show() {
super.show();
System.err.print("红色 ");
}
}
BlueStyle
package com.tankiy.Decoration;
/**
* <p>Title: Decoration(装饰模式)</p>
* @author Tankiy
* @version 1.0
*/
public class BlueStyle extends Style {
public void show() {
super.show();
System.err.print("蓝色 ");
}
}
Content
package com.tankiy.Decoration;
/**
* <p>Title: Decoration(装饰模式)</p>
* @author Tankiy
* @version 1.0
*/
public class Content extends Style {
public void show() {
super.show();
System.err.println("新闻资讯 ");
}
}
测试用例
package com.tankiy.Decoration;
import junit.framework.TestCase;
/**
* <p>Title: Decoration(装饰模式)</p>
* @author Tankiy
* @version 1.0
*/
public class StyleTest extends TestCase {
public void testStyle() {
User user = new User();
user.setUserName("Tankiy");
Style redStyle = new RedStyle();
Style content = new Content();
redStyle.setStyle(user);
content.setStyle(redStyle);
content.show();
}
}
结果如图: