`
kangsg219
  • 浏览: 121417 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

学习笔记之策略模式

阅读更多
策略(Strategy)模式:定义了算法族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户。属于设计模式中对象行为型模式。


下面看代码:

抽象类Duck.java

package org.kangsg219.abst;

import org.kangsg219.intf.FlyBehavior;
import org.kangsg219.intf.QuackBehavior;

public abstract class Duck {
	
	public FlyBehavior flybehavior;
	
	public QuackBehavior quackbehavior;
	
	public Duck(){
		
	}
	
	public abstract void display();
	
	public void performFly(){
		flybehavior.fly();
	}
	
	public void setFlybehavior(FlyBehavior flybehavior) {
		this.flybehavior = flybehavior;
	}

	public void setQuackbehavior(QuackBehavior quackbehavior) {
		this.quackbehavior = quackbehavior;
	}

	public void performQuack(){
		quackbehavior.quack();
	}
	
	public void swim(){
		System.out.println("All ducks float,even decoys!");
	}
}



duck具备两个行为:飞和叫;先分别定义接口再实现
package org.kangsg219.intf;

public interface FlyBehavior {
	public void fly();
}


package org.kangsg219.intf;

public interface QuackBehavior {

	public void quack();
}


package org.kangsg219.impl;

import org.kangsg219.intf.FlyBehavior;

public class FlyNoWay implements FlyBehavior {

	public void fly() {
		System.out.println("I can't fly!");

	}

}


package org.kangsg219.impl;

import org.kangsg219.intf.FlyBehavior;

public class FlyWithRocket implements FlyBehavior {

	public void fly() {
		System.out.println("I'm flying whit rocket!");
	}

}


package org.kangsg219.impl;

import org.kangsg219.intf.FlyBehavior;

public class FlyWithWings implements FlyBehavior {

	public void fly() {
		System.out.println("I'm flying with wings!");

	}

}


package org.kangsg219.impl;

import org.kangsg219.intf.QuackBehavior;

public class MuteQuack implements QuackBehavior {

	public void quack() {
		System.out.println("<silence>");

	}

}


package org.kangsg219.impl;

import org.kangsg219.intf.QuackBehavior;

public class Quack implements QuackBehavior {

	public void quack() {
		System.out.println("Quack......");

	}

}


package org.kangsg219.impl;

import org.kangsg219.intf.QuackBehavior;

public class Squeak implements QuackBehavior {

	public void quack() {
		System.out.println("Squeak......");

	}

}


看看效果
package org.kangsg219.test;

import org.kangsg219.abst.Duck;
import org.kangsg219.impl.FlyWithWings;
import org.kangsg219.impl.Quack;



public class MallardDuck extends Duck {

	public MallardDuck(){
		quackbehavior=new Quack();
		flybehavior=new FlyWithWings();
	}
	
	@Override
	public void display() {
		System.out.println("I'm a real mallard duck!");

	}

}


package org.kangsg219.test;

import org.kangsg219.abst.Duck;
import org.kangsg219.impl.FlyWithRocket;
import org.kangsg219.impl.Quack;

public class MiniDuckSimulator {

	
	public static void main(String[] args) {
		
		System.out.println("mallard duck********************");
		Duck mallard=new MallardDuck();
		mallard.performFly();
		mallard.performQuack();
		mallard.swim();
		mallard.display();
		
		System.out.println("modle duck********************");
		Duck modle=new ModleDuck();
		modle.setFlybehavior(new FlyWithRocket());
		modle.setQuackbehavior(new Quack());
		modle.performFly();
		modle.performQuack();
		modle.swim();
		modle.display();
		
	}

}


package org.kangsg219.test;

import org.kangsg219.abst.Duck;

public class ModleDuck extends Duck {

	@Override
	public void display() {
		System.out.println("I'm a modle duck!");

	}

}

分享到:
评论
2 楼 bomb2121 2008-01-07  
老弟,做的不错哈。不过要能多加上一点你自己的想法就更好了。
策略模式:在spring中最是常用的。看看spring对各个层面中提供的集成多种框架的能力就知道了:)
1 楼 kangsg219 2007-10-19  
代码来自《Head First 设计模式》

相关推荐

    javascript设计模式之策略模式学习笔记.docx

    javascript设计模式之策略模式学习笔记.docx

    HeadFirst 设计模式学习笔记1--策略模式Demo

    http://blog.csdn.net/laszloyu/archive/2010/05/11/5579765.aspx 示例代码

    javascript设计模式之策略模式学习笔记

    1. 理解javascript中的策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 使用策略模式的优点如下: 优点:  1. 策略模式利用组合,委托等技术和思想,有效的避免很多...

    设计模式学习笔记

    工厂模式,策略模式,装饰模式,代理模式,工厂方法模式,原型模式等23个设计模式

    head first策略者模式

    head first策略者模式学习笔记

    尚硅谷设计模式源码笔记课件.zip

    行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...

    javascript设计模式之中介者模式学习笔记

    主要为大家详细介绍了javascript设计模式之中介者模式学习笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    3. 行为型模式:行为型模式关注对象之间的通信和协作,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。这些模式可以帮助...

    java-design-patterns:Java 设计模式学习笔记

    将不同的行为代码解耦观察者模式模板方法模式策略模式职责链模式状态模式迭代器模式访问者模式备忘录模式命令模式解释器模式中介者模式后记由于自身能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流...

    markdown:前端学习笔记

    学习笔记(持续更新) 验证你是否真正掌握一个知识的最好方法,就是看你能否用直白浅显的语言把复杂深奥的问题和知识讲清楚 -- 费曼技巧「以教为学」 大纲 前端杂记 策略模式 发布订阅者模式 责任链模式(todo) 0.1...

    Spring MVC 学习笔记

    5、 ModelAndView的逻辑视图名交给ViewResolver解析器, ViewResolver解析器把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术; 6、 View会根据传进来的Model模型数据进行渲染,此处的...

    统计学个人学习笔记.zip

    机器学习(Machine Learning)是一种人工智能(AI)...强化学习(Reinforcement Learning):算法通过与环境的交互学习,通过尝试和错误来优化决策策略,以达到最大化奖励的目标。 机器学习在各个领域中都有广泛的应用

    敏捷测试学习笔记.pptx

    敏捷测试是指敏捷开发模式下的一套完整的软件测试解决方案,它强调: “与开发协作”、 “自动化测试”、 “客户思维”、 “动态的测试策略调整”。

    JS-design-pattern:根据曾探所著《JavaScript设计模式与开发实践》整理的学习笔记

    JS-design-pattern根据曾探所著《JavaScript设计模式与开发实践》整理的学习笔记基础知识创建模式结构模式行为模式状态模式策略模式发布订阅模式

    java版中国象棋源码-hello-design-pattern:设计模式学习笔记

    设计模式学习笔记,此项目参考《大话设计模式》,只能作为入门级设计模式学习 设计原则 职责单一原则 开放-封闭原则 依赖倒转原则 高层模块不依赖底层模块,两个模块都应该依赖抽象。抽象不依赖细节,细节依赖抽象。...

    左程云leetcode-hjLearningNotes:hj学习笔记

    策略模式 责任链模式 命令模式 模板方法模式 适配器模式 代理模式 外观模式 组合模式 装饰模式 享元模式 桥接模式 Builder模式 状态模式 解释器模式 观察者模式 备忘录模式 迭代器模式 访问者模式 中介者模式 第二...

    Java并发编程(学习笔记).xmind

    生产者-消费者模式 中断的处理策略 传递InterruptedException 恢复中断,让更高层的代码处理 PriorityQueue(非并发) ConcurrentSkipListMap 替代同步的SortedMap ...

    Java学习笔记-个人整理的

    {7.2}回调模式与FileFilter}{104}{section.7.2} {7.3}\ttfamily RandomAccessFile}{106}{section.7.3} {7.4}基本类型数据序列化}{108}{section.7.4} {7.5}String的序列化}{109}{section.7.5} {7.6}InputStream...

Global site tag (gtag.js) - Google Analytics