设计模式学习之--策略模式

策略模式是什么:首先,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。说的有点不太容易理解,在我们面向对象的思想中一般都是结合我们的生活实例,举个现实的例子,我们的动物中有多种不同的鸟,它们都会飞行,都会走路,但它们的飞行方式不同,有些是翱翔,有些是燕子那样飞行,也有会像俯飞的(这个例子有点挫),但是鸟都会飞,它们的飞行策略是不同的,这里飞行就是不同的算法,或许很多不同的鸟会采用一种的飞行方式,也有的鸟不会飞行。这些策略就是不一样的算法。

策略模式的实现

(1)通过分离变化得出策略接口strategy

(2)strategy的实现类

(3)客户程序中“有一个”strategy

(4)客户程序中选择组装正确的strategy实现,客户程序一般是我们的主要业务类

这里举一个制作不同鸭子的例子来说明一下怎么实现的:

鸭子的抽象类:

package com.imooc.pattern.strategy;

/*
 * 超类,所有的鸭子都要继承此类
 * 抽象了鸭子的行为:显示和鸣叫
 */
public abstract class Duck {

	/*
	 * 鸭子发出叫声
	 * 通用行为,由超类实现
	 */
	public void quack(){
		System.out.println("嘎嘎嘎");
	}

	/*
	 * 显示鸭子的外观
	 * 鸭子的外观各不相同,声明为abstract, 由子类实现
	 */
	public abstract void display();

	private FlyingStragety flyingStragety;//这个是策略stragety,不同的鸭子不同的飞行方式实现这个接口

	public void setFlyingStragety(FlyingStragety flyingStragety) {
		this.flyingStragety = flyingStragety;
	}

	public void fly(){
		flyingStragety.performFly();
	}

}

策略接口:

package com.imooc.pattern.strategy;
/*
 * 策略接口,实现鸭子的飞行行为
 */
public interface FlyingStragety {

	void performFly();
}

接下来我们定义不同的鸭子:

package com.imooc.pattern.strategy;

import com.imooc.pattern.strategy.impl.FlyWithWin;

//这个是一个普通飞行的鸭子

public class RedheadDuck extends Duck {

	public RedheadDuck(){
		super();
		super.setFlyingStragety(new FlyWithWin());//传入一个靠风飞行的算法实现
	}

	@Override
	public void display() {
		System.out.println("我的头是红色的");
	}

}

package com.imooc.pattern.strategy;

import com.imooc.pattern.strategy.impl.FlyWithRocket;
//这是一个会飞的用火箭飞的鸭子
public class SpaceDuck extends Duck {

	public SpaceDuck() {
		super();
		super.setFlyingStragety(new FlyWithRocket());//传入一个实现飞行接口的实现类定义飞行算法
	}

	@Override
	public void display() {
		System.out.println("我头戴宇航头盔");
	}

	public void quack(){
		System.out.println("我通过无线电与你通信");
	}

}

两个飞行策略的实现:

package com.imooc.pattern.strategy.impl;

import com.imooc.pattern.strategy.FlyingStragety;

public class FlyWithWin implements FlyingStragety {

	public void performFly() {
		System.out.println("振翅高飞");
	}

}

package com.imooc.pattern.strategy.impl;

import com.imooc.pattern.strategy.FlyingStragety;

public class FlyWithRocket implements FlyingStragety {

	public void performFly() {
		System.out.println("用火箭在太空遨游");
	}

}

下面是一个测试类,测试不同的飞行的鸭子:

package com.imooc.pattern.strategy;

public class DuckTest {

	public static void main(String[] args){
		System.out.println("测试鸭子程序");
		System.out.println("************************");
		Duck duck = null;
	        //duck = new RedheadDuck();
		duck = new SpaceDuck();

		duck.display();
		duck.quack();
		duck.fly();
		System.out.println("************************");
		System.out.println("测试完毕");
	}

}

这就是策略模式的案例,发现是更清晰了,以后不同的鸭子需要不同的功能,我们把这些类只是相关的行为不同的时候,且运行时选用不同的算法,就可以考虑使用我们的策略模式了。不然我们的类肯定会有许多判断语句,这个时候使用策略模式就好了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 06:00:21

设计模式学习之--策略模式的相关文章

设计模式学习笔记--策略模式

定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 我们在使用一些功能时,有时有很多种实现方法,或者多种结果,但是都有同样的使用方法,即调用接口,这就是策略模式. 例子: // 设计模式Demo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <string> using namespa

&lt;C/C++ 版&gt; 设计模式 学习之 策略模式

策略模式(strategy):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户. 在下面的情况下应当考虑使用策略模式: 1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为. 2. 一个系统需要动态地在几种算法中选择一种.那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类.换言之,这些具体算法类均 有统一的接口,由于多态性原则,客户端可

&lt;C/C++ 版&gt; 设计模式 学习之 策略模式+工厂模式

策略模式是一种定义一系列算法的方法,从概念上来讲,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方法调用所有的算法,减少各种算法类与使用算法类之间的耦合. 策略模式的 strategy (COperate)类层为 context 定义了一些了可供重用的算法或者行为,继承有助于析取这些算法中的公公功能. 策略模式简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试. 每个算法可以保证自身没有错误 ,修改其中的一个不会影响到其他算法. 测试代码如下: //Stra_F

设计模式学习之策略模式

一个报价管理系统 在一些CRM(客户关系管理)系统中,会有一个单独的报价管理模块,处理复杂的报价功能 普通客户:全价 老客户:根据年限,给予折扣 大客户:根据累计消费,给予折扣 客户购买量:对于新老客户都适用 报价人员职位高低: 如何实现???? 一个支付策略的接口 package com.cmc; //一个报价接口类,提供报价的接口,传入的参数为钱数 public interface OfferSuper { public abstract double offerCash(double mo

设计模式学习之策略模式:容错恢复机制

容错恢复机制 应用程序开发中常见的功能 程序运行的时候,正常情况下应该按某种方式来做,如果按照某种方式来做发生错误的话,系统并不会崩溃,而是继续运行,能提供出错后的备用方案. 日志记录的例子 把日志记录到数据库和日志记录到文件当做两种记录日志的策略 日志记录的策略接口: package com.cmc; public interface LogStrategy { public void SaveLog(String msg); } 把日志写到文件的策略: package com.cmc; pu

设计模式进阶(一) 策略模式

摘自<Design Paterns_Elements of Reusable Object-Oriented Software> 上一系列偏重于入门,从本篇开启进阶系列,着重于设计模式的适用情景. 回顾入门系列 设计模式入门(一)  策略模式 1  Intent Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary

设计模式学习之-状态模式

一.状态模式状态模式,当一个对象的内在状态发生改变时允许改变其行为行为,这个对象像是改变了其子类.状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的状态的一系列类当中,可以把复杂的判断逻辑简化.当然,如果这个状态判断比较简单,那就没有必要用“状态模式”了.这段话有点难以理解,简而言之就是,在一类中根据当前状态去实例化下一状态子类.下面是状态模式结构图. State类,是一个抽象状态类,定义一个接口以封装与Context的特定状态相关的行为.

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou