如果写一个类的方?按照q个需求来写if语句,可以,但是,如果有两套定制的?一套需要其中的几种变化,另外需要另外几U?那么需?个方?而且其中有很多的重复代码,q样行不通的.
其实设计模式说到?其根本思想是扑ֈ变化q封装之.q里变化的是处理的方?那么我们把它封装v?实现的类如下:
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不能修改传递的?所以写一个类来封装一个integer
/**
*
*/
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);
}
每个实现的类只需要来实现executeBefore和executeAfterҎ(gu)卛_.
注意实现的顺序是
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());
}
}
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);
}
}
}
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);
}
}
}
/**
*
*/
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());
}
}
输出l果?
starting PositiveDecorater!
Starting Devide2Decorater!
Starting Devide3Decorater!
Devide3Decorater end!
Devide2Decorater end!
PositiveDecorater end!
3
其实每种设计模式的核?j)思想都是一致的,但是没有必要照本宣科,只要注意其模式的_N,可以了(jin),剩下的就是自己去按照实现来设计其中的l节?比如我设计这个模?是先写?jin)main函数,把其中的Ҏ(gu)写好,然后L照这个实现来惛_如何实现,q样才更W合解决实际的问?其实decorater模式有很多种实现方式.比如下面的这U解?也可:
/**
*
*/
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;
/**
* @author KONGHE
*
*/
public abstract class Decorater {
public abstract Integer process(Integer x);
}
总而言?模式是ؓ(f)?jin)具体的实际情况而服务的,不要Z(jin)一定要ȝ某种设计模式而委屈自q需?
在设计的时候多x,可能某天你再读设计模式的?你会(x)发现,原来我之前写的代?包含?jin)这么多的设计模式?

]]>