软件构造关于设计模式的总结

这篇博客探讨了四种常见的设计模式:工厂方法、装饰器模式、策略模式和模板模式。工厂方法适用于client不明确创建哪个具体类实例的情况,通过接口延迟实例化。装饰器模式用于给对象添加多个特性,允许动态组合特性。策略模式允许在运行时动态选择算法,提供灵活的行为。模板模式则定义了一组步骤,子类可以重写部分步骤以实现不同行为。
摘要由CSDN通过智能技术生成

第一次面对在构建软件中考虑到设计模式这样的问题,许许多多的设计模式,比如说工厂设计模式,适配器模式,装饰器模式,模板模式等等,都让我大开眼界。所以这篇博客打算记录以下各个设计模式学习中的心得。

目录

工厂方法总结

装饰器模式总结

策略模式总结

模板模式总结


工厂方法总结:

运用的背景,即什么时候需要使用:当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() { … }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值