第一次面对在构建软件中考虑到设计模式这样的问题,许许多多的设计模式,比如说工厂设计模式,适配器模式,装饰器模式,模板模式等等,都让我大开眼界。所以这篇博客打算记录以下各个设计模式学习中的心得。
目录
工厂方法总结:
运用的背景,即什么时候需要使用:当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
使用的特点:定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个
类的实例化延迟到其子类。
下面稍稍详细介绍一下工厂方法:首先是工厂模式的设计方案。
代码用例:
首先分别有两个product:
代码一:Concrete product 1
public class FileTrace implements Trace {
private PrintWriter pw;
private boolean debug;
public FileTrace() throws IOException {
pw = new PrintWriter( new FileWriter( "t.log" ) );
}
public void setDebug( boolean debug ) {
this.debug = debug;
}
public void debug( String message ) {
if( debug ) {
pw.println( "DEBUG: " + message );
pw.flush();
}
}
public void error( String message ) {
pw.println( "ERROR: " + message );
pw.flush();
}
}
代码二:Concrete product 2
public class SystemTrace implements Trace {
private boolean debug;
public void setDebug( boolean debug ) {
this.debug = debug;
}
public void debug( String message ) {
if( debug )
System.out.println( "DEBUG: " + message );
}
public void error( String message ) {
System.out.println( "ERROR: " + message );
}
}
这时在使用就需要这样的调用,比较方便客户不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时使用。
装饰器模式总结
如果在一个父类需要到具体的使用场景中去,但是需要用每个子类实现不同的特性,如果需要特性的任意组合,这就需要用到我们的装饰器模式。
我们这个模式的处理方式如下:
为对象增加不同侧面的特性。
对每一个特性构造子类,通过委派机制增加到对象上。
装饰器代码举例:
interface Stack {
void push(Item e);
Item pop();
}
public abstract class StackDecorator implements Stack {
protected final Stack stack;
public StackDecorator(Stack stack) {
this.stack = stack;
}
public void push(Item e) {
stack.push(e);
}
public Item pop() {
return stack.pop();
}
...
}
在这个模式中,就像一层一层的穿衣服,客户端需要一个具有多种特性的object,通过一层一层的装饰来实现。
策略模式总结
有时,有多种不同的算法来实现同一个任务,但需要client根据需要,动态切换算法,而不是写死在代码里。在写代码的时候,为不同的实现算法构造抽象接口,利用delegation,运行时动态传入client倾向的算法类实例。这时候就需要用上我们的策略模式。
代码举例:
接口代码:
public interface PaymentStrategy {
public void pay(int amount);
}
实现类代码:
public class ShoppingCart {
...
public void pay(PaymentStrategy paymentMethod){
int amount = calculateTotal();
paymentMethod.pay(amount);
}
}
装饰器使用:
public class ShoppingCartTest {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item item1 = new Item("1234",10);
Item item2 = new Item("5678",40);
cart.addItem(item1);
cart.addItem(item2);
//pay by paypal
cart.pay(new PaypalStrategy("myemail@exp.com", "mypwd"));
//pay by credit card
cart.pay(new CreditCardStrategy(“Alice", "1234", "786", "12/18"));
}
}
模板模式总结
在实现一些功能的时候,上级的架构者可以调用模板模式,做事情的步骤一样,但具体方法不同共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现。写的人可以采用使用继承和重写实现模板模式。
示例代码:
模板类代码:
public abstract class OrderProcessTemplate {
public boolean isGift;
public abstract void doSelect();
public abstract void doPayment();
public final void giftWrap() {
System.out.println("Gift wrap done.");
}
public abstract void doDelivery();
public final void processOrder() {
doSelect();
doPayment();
if (isGift)
giftWrap();
doDelivery();
}
}
重写的代码:
public class NetOrder
extends OrderProcessTemplate {
@Override
public void doSelect() { … }
@Override
public void doPayment() { … }
@Override
public void doDelivery() { … }
}