decorator裝飾模式的一種改進(jìn)寫(xiě)法
倘若,有這么一個(gè)需求,對(duì)于一個(gè)數(shù)字,如果是負(fù)的,那么需要變成正的相反數(shù),如果是2的倍數(shù),那么就除以2,如果是3的倍數(shù),那么就除以3,可能以后還有其他的需求,比如是5的倍數(shù),就再除以5,或者是6的倍數(shù),那么就加上6,也就是結(jié)果與順序息息相關(guān),那么應(yīng)該如何來(lái)實(shí)現(xiàn)呢?
如果寫(xiě)一個(gè)類(lèi)的方法,按照這個(gè)需求來(lái)寫(xiě)if語(yǔ)句,可以,但是,如果有兩套定制的呢?一套需要其中的幾種變化,另外需要另外幾種,那么就需要2個(gè)方法,而且其中有很多的重復(fù)代碼,這樣行不通的.
其實(shí)設(shè)計(jì)模式說(shuō)到底,其根本思想就是找到變化并封裝之.這里變化的是處理的方法,那么我們就把它封裝起來(lái).實(shí)現(xiàn)的類(lèi)如下:
注意實(shí)現(xiàn)的順序是
decorater1.executeBefore->decorater2.executeBefore->decorater3.executeBefore->decorater3.executeAfter->decorater2.executeAfter->decorater1.executerAfter
輸出結(jié)果是:
starting PositiveDecorater!
Starting Devide2Decorater!
Starting Devide3Decorater!
Devide3Decorater end!
Devide2Decorater end!
PositiveDecorater end!
3
其實(shí)每種設(shè)計(jì)模式的核心思想都是一致的,但是沒(méi)有必要照本宣科,只要注意其模式的精髓,就可以了,剩下的就是自己去按照實(shí)現(xiàn)來(lái)設(shè)計(jì)其中的細(xì)節(jié)了.比如我設(shè)計(jì)這個(gè)模式,就是先寫(xiě)了main函數(shù),把其中的方法寫(xiě)好,然后去按照這個(gè)實(shí)現(xiàn)來(lái)想去如何實(shí)現(xiàn),這樣才更符合解決實(shí)際的問(wèn)題.其實(shí)decorater模式有很多種實(shí)現(xiàn)方式.比如下面的這種解法,也可:
總而言之,模式是為了具體的實(shí)際情況而服務(wù)的,不要為了一定要去用某種設(shè)計(jì)模式而委屈自己的需求.
在設(shè)計(jì)的時(shí)候多想想,可能某天你再讀設(shè)計(jì)模式的書(shū),你會(huì)發(fā)現(xiàn),原來(lái)我之前寫(xiě)的代碼,包含了這么多的設(shè)計(jì)模式啊!
如果寫(xiě)一個(gè)類(lèi)的方法,按照這個(gè)需求來(lái)寫(xiě)if語(yǔ)句,可以,但是,如果有兩套定制的呢?一套需要其中的幾種變化,另外需要另外幾種,那么就需要2個(gè)方法,而且其中有很多的重復(fù)代碼,這樣行不通的.
其實(shí)設(shè)計(jì)模式說(shuō)到底,其根本思想就是找到變化并封裝之.這里變化的是處理的方法,那么我們就把它封裝起來(lái).實(shí)現(xiàn)的類(lèi)如下:
package decorater;
public class Integor {
private Integer x;
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
Integor(Integer x){
this.x = x;
}
}
由于Integer不能修改傳遞的值,所以寫(xiě)一個(gè)類(lèi)來(lái)封裝一個(gè)integerpublic class Integor {
private Integer x;
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
Integor(Integer x){
this.x = x;
}
}
/**
*
*/
package decorater;
public abstract class Decorater {
private Decorater next;
public Decorater setNext(Decorater dcrtr) {
this.next = dcrtr;
return this.next;
}
public void process(Integor x) {
this.executeBefore(x);
if (this.next != null) {
this.next.process(x);
}
this.executeAfter(x);
}
protected abstract void executeBefore(Object x);
protected abstract void executeAfter(Object x);
}
每個(gè)實(shí)現(xiàn)的類(lèi)只需要來(lái)實(shí)現(xiàn)executeBefore和executeAfter方法即可.*
*/
package decorater;
public abstract class Decorater {
private Decorater next;
public Decorater setNext(Decorater dcrtr) {
this.next = dcrtr;
return this.next;
}
public void process(Integor x) {
this.executeBefore(x);
if (this.next != null) {
this.next.process(x);
}
this.executeAfter(x);
}
protected abstract void executeBefore(Object x);
protected abstract void executeAfter(Object x);
}
注意實(shí)現(xiàn)的順序是
decorater1.executeBefore->decorater2.executeBefore->decorater3.executeBefore->decorater3.executeAfter->decorater2.executeAfter->decorater1.executerAfter
package decorater;
public class PositiveDecorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("PositiveDecorater end!");
}
@Override
protected void executeBefore(Object x) {
// TODO Auto-generated method stub
System.out.println("starting PositiveDecorater!");
Integor in = (Integor) x;
if (in.getX() < 0)
in.setX(-in.getX());
}
}
public class PositiveDecorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("PositiveDecorater end!");
}
@Override
protected void executeBefore(Object x) {
// TODO Auto-generated method stub
System.out.println("starting PositiveDecorater!");
Integor in = (Integor) x;
if (in.getX() < 0)
in.setX(-in.getX());
}
}
package decorater;
public class Devide2Decorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("Devide2Decorater end!");
}
@Override
protected void executeBefore(Object x) {
System.out.println("Starting Devide2Decorater!");
Integor in = (Integor) x;
if (in.getX() % 2 == 0) {
in.setX(in.getX() / 2);
}
}
}
public class Devide2Decorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("Devide2Decorater end!");
}
@Override
protected void executeBefore(Object x) {
System.out.println("Starting Devide2Decorater!");
Integor in = (Integor) x;
if (in.getX() % 2 == 0) {
in.setX(in.getX() / 2);
}
}
}
package decorater;
public class Devide3Decorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("Devide3Decorater end!");
}
@Override
protected void executeBefore(Object x) {
System.out.println("Starting Devide3Decorater!");
Integor in = (Integor) x;
if (in.getX() % 3 == 0) {
in.setX(in.getX() / 3);
}
}
}
public class Devide3Decorater extends Decorater {
@Override
protected void executeAfter(Object x) {
System.out.println("Devide3Decorater end!");
}
@Override
protected void executeBefore(Object x) {
System.out.println("Starting Devide3Decorater!");
Integor in = (Integor) x;
if (in.getX() % 3 == 0) {
in.setX(in.getX() / 3);
}
}
}
/**
*
*/
package decorater;
/**
* @author KONGHE
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Decorater a = new PositiveDecorater();
a.setNext(new Devide2Decorater()).setNext(new Devide3Decorater());
Integor x = new Integor(-18);
a.process(x);
System.out.println(x.getX());
}
}
*
*/
package decorater;
/**
* @author KONGHE
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
Decorater a = new PositiveDecorater();
a.setNext(new Devide2Decorater()).setNext(new Devide3Decorater());
Integor x = new Integor(-18);
a.process(x);
System.out.println(x.getX());
}
}
輸出結(jié)果是:
starting PositiveDecorater!
Starting Devide2Decorater!
Starting Devide3Decorater!
Devide3Decorater end!
Devide2Decorater end!
PositiveDecorater end!
3
其實(shí)每種設(shè)計(jì)模式的核心思想都是一致的,但是沒(méi)有必要照本宣科,只要注意其模式的精髓,就可以了,剩下的就是自己去按照實(shí)現(xiàn)來(lái)設(shè)計(jì)其中的細(xì)節(jié)了.比如我設(shè)計(jì)這個(gè)模式,就是先寫(xiě)了main函數(shù),把其中的方法寫(xiě)好,然后去按照這個(gè)實(shí)現(xiàn)來(lái)想去如何實(shí)現(xiàn),這樣才更符合解決實(shí)際的問(wèn)題.其實(shí)decorater模式有很多種實(shí)現(xiàn)方式.比如下面的這種解法,也可:
/**
*
*/
package decorator;
/**
* @author KONGHE
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
DecoraterChain a = new DecoraterChain();
a.setNext(new PositiveDecorater()).setNext(new Devide2Decorater()).setNext(new Devide3Decorater());
Integer x = -32;
x = a.process(x);
System.out.println(x);
}
}
*
*/
package decorator;
/**
* @author KONGHE
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
DecoraterChain a = new DecoraterChain();
a.setNext(new PositiveDecorater()).setNext(new Devide2Decorater()).setNext(new Devide3Decorater());
Integer x = -32;
x = a.process(x);
System.out.println(x);
}
}
/**
*
*/
package decorator;
import java.util.ArrayList;
import java.util.List;
/**
* @author KONGHE
*
*/
public class DecoraterChain {
private List<Decorater> decorater = new ArrayList<Decorater>();
public DecoraterChain setNext(Decorater decrter) {
decorater.add(decrter);
return this;
}
public Integer process(Integer x) {
for (int i = 0; i < this.decorater.size(); i++) {
x = this.decorater.get(i).process(x);
}
return x;
}
}
*
*/
package decorator;
import java.util.ArrayList;
import java.util.List;
/**
* @author KONGHE
*
*/
public class DecoraterChain {
private List<Decorater> decorater = new ArrayList<Decorater>();
public DecoraterChain setNext(Decorater decrter) {
decorater.add(decrter);
return this;
}
public Integer process(Integer x) {
for (int i = 0; i < this.decorater.size(); i++) {
x = this.decorater.get(i).process(x);
}
return x;
}
}
/**
*
*/
package decorator;
/**
* @author KONGHE
*
*/
public abstract class Decorater {
public abstract Integer process(Integer x);
}
*
*/
package decorator;
/**
* @author KONGHE
*
*/
public abstract class Decorater {
public abstract Integer process(Integer x);
}
總而言之,模式是為了具體的實(shí)際情況而服務(wù)的,不要為了一定要去用某種設(shè)計(jì)模式而委屈自己的需求.
在設(shè)計(jì)的時(shí)候多想想,可能某天你再讀設(shè)計(jì)模式的書(shū),你會(huì)發(fā)現(xiàn),原來(lái)我之前寫(xiě)的代碼,包含了這么多的設(shè)計(jì)模式啊!
posted on 2009-05-22 17:20 孔陽(yáng) 閱讀(1375) 評(píng)論(3) 編輯 收藏