裝飾者模式
來源:程序員人生 發布時間:2015-06-09 08:04:11 閱讀次數:3352次
裝潢模式:動態地給1個對象添加1些額外的職責,就增加功能而言,裝潢者模式比生成子類更加靈活。Component是定義1個對象接口,可以給這些對象動態地添加職責,ConcreteComppnent是定義了1個具體的對象,也能夠給這個對象添加1些職責,Decorator,裝潢抽象類,繼承了Component,從外類來擴大Component類的功能,但對Component來講,是無需知道Decorator的存在的,至于ConcreteDecorator就是具體的裝潢對象,起到給Component添加職責的功能

上面是裝潢者模式Decorator的類圖。
實現代碼以下:
Component類:
abstract class Component{
public abstract void operation();
}
ConcreteComponent類:
class ConcreteCompoent extends Component{
public void operation{
System.out.println("具體對象的操作:");
}
}
Decorator類:
abstract class Decorator extends Compoent{
protected Component compoent;
pbulic void setComponent(Component component){
this.component = component;
}
public void operation(){
if(component!=null){
component.Operation();
}
}
}
class ConcreteDecortorA extends Decorator{
private String addedState;
public void operation(){
super.operation();
addedState = "new Stare";
System.out.println("具體裝潢對象A的操作");
}
}
class ConcreteDecortorB extends Decorator{
public void Operation(){
super.Operation();
AddedBehavior();
System.out.println("具體裝潢對象B的操作");
}
private void AddedBehavior(){
}
}
public class Test{
public static void main(String[] args) {
ConcreteComponent c = new ConcreteComponent();
ConcreteComponentA d1 = new ConcreteComponentA();
ConcreteComponentB d2 = new ConcreteComponentB();
d1.setComponent(c);
d2.setComponent(d1);
d2.operation();
}
}
裝潢者模式是利用setComponent來對對象進行包裝的,這樣每一個裝潢對象的實現就和如何使用這個對象分離開了,每一個裝潢對象只關心自己的功能,不需要關心如何被添加到對象鏈當中。
如果只有1個ConcreteComponent類而沒有抽象的Component類,那末Decotator類可以是ConcreteComponent的1個子類,一樣道理,如果只有1個ConcreteDecorator類,那末就沒有必要建立1個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合并成1個類。
下面是1個例子:
public class Person {
public Person() {
}
private String name;
public Person(String name) {
this.name = name;
}
public void show() {
System.out.println("打扮的:" + name);
}
}
public class Finery extends Person {
protected Person component;
public void Decorate(Person component) {
this.component = component;
}
public void show() {
if (component != null) {
component.show();
}
}
}
class TShirts extends Finery {
public void show() {
System.out.println("大T恤");
super.show();
}
}
class BigTrouser extends Finery {
public void show() {
System.out.println("垮褲");
super.show();
}
}
class Sneakers extends Finery {
public void show() {
System.out.println("破球鞋");
super.show();
}
}
class LeatherShoes extends Finery {
public void show() {
System.out.println("皮鞋");
super.show();
}
}
class Tie extends Finery {
public void show() {
System.out.println("領帶");
super.show();
}
}
class Suit extends Finery {
public void show() {
System.out.println("西裝");
super.show();
}
}
public class Test {
public static void main(String[] args) {
Person xc = new Person("菜鳥");
System.out.println("第1種打扮");
Sneakers pqx = new Sneakers();
BigTrouser kk = new BigTrouser();
TShirts dtx = new TShirts();
pqx.Decorate(xc);
kk.Decorate(pqx);
dtx.Decorate(kk);
dtx.show();
}
}
小結:
裝潢者模式是為已有功能動態地添加更多功能的1種方式,甚么情況用到呢?當系統需要新的功能的時候,在1般情況下,我們想到的是向舊的類中添加新的代碼。這些新的代碼通常裝潢了原有類的核心職責或主要行動,他們在主類中加入了新的字段、新的方法和新的邏輯,從而增加了主類的復雜度,而這些新加入的東西僅僅是為了滿足1些只有在某種特定情況下才會履行的特殊行動的需要,而裝潢者模式可以提供1個非常好的解決方案,它把每一個要裝潢的功能放在單獨的類中,并讓這個類包裝它所要裝潢的對象,因此,當需要履行特殊行動時,客戶代碼就能夠在運行時根據需要有選擇地、按順序地使用裝潢功能包裝對象了。裝潢者模式的優點是把類中的裝潢功能從類中搬移去除,這樣可以簡化原本的類;另外1個使有效地把類的核心職責和裝潢功能辨別開了,而且可以去除相干類中重復的裝潢邏輯。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈