设计模式学习笔记--Strategy、State

本文通过具体示例介绍策略模式的应用场景及其实现方式,探讨如何利用策略模式提高代码的可扩展性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看设计模式的,防止遗忘,总结一下,如有不足还望指正!

策略模式:(strategy)定义算法家族,分别封装起来,让他们之间可以相互替换。此模式可以让算法的变化,不影响使用算法的用户。

类图:



/**
 * 抽象算法类
 * Created by dell on 2014/12/30.
 */
public abstract class Strategy {
    //算法方法
    public abstract void AlgorithmInterface();
}

ConcreteStrategyA.java

/**
 * Created by dell on 2014/12/30.
 */
public class ConcreteStrategyA extends Strategy{
    //算法A实现方法
    @Override
    public void AlgorithmInterface() {
        System.out.println("算法A实现");
    }
}

ConcreteStrategyB.java

/**
 * Created by dell on 2014/12/30.
 */
public class ConcreteStrategyB extends Strategy {
    @Override
    public void AlgorithmInterface() {
        System.out.println("算法B实现");
    }
}

Context.java
/**
 * Created by dell on 2014/12/30.
 */
public class Context {
    Strategy strategy;
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    //上下文接口
    public void contextInterface(){
        strategy.AlgorithmInterface();
    }
}

/**
 * Created by dell on 2014/12/30.
 */
public class StrategyClient {
    public static void main(String[] args){
        /**
         * 父类引用指向子类对象,由于实例话不同的策略,最终在调用同样的方法时,得到不同的结果。
         */
        Context context;
        context = new Context(new ConcreteStrategyA());
        context.contextInterface();

        context = new Context(new ConcreteStrategyB());
        context.contextInterface();
    }
}
以上的解释也仅仅使自己了解了这个模式,并不了解它的使用。最近看了一个视频,才明白一点,现在分享一下,共同学习。

以下用到的是一个排序算法,类图如下:


DataSort为一个排序类,为了使所有类都可以使用此类,定义了Comparable接口,包含int compareTo(Object obj)方法,正如Java JDK自带的Comparable类,使要排序的类,实现此接口,实现各自的compareTo()方法,这样就DataSort类就可以实现了复用。当然此时并没有使用到策略模式。
如上图,可以Cat含有Height,Weight属性,如果想方便的根据Height,Weight实现排序这时策略模式将是一个不错的选择。当然,也可以不使用此模式,例如在compareTo()方法的实现中每次修改排序的条件,也可以实现功能。
但是,有时我们有很多的排序规则,事先并不确定,这是修改compareTo()方法将是一个很不明智的选择。这时,可以抽象出公共算法接口,如:Comparator,而它的子类实现具体的排序规则,当需要更多的排序规则时,仅仅需要创建新的类实现Comparator就可以。这样就使我们的程序拥有更好的可扩展性。

State:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值