`
鬼大来晚了
  • 浏览: 67885 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Java设计模式——策略模式

    博客分类:
  • Java
 
阅读更多
   《Thinking in Java》看了一大部分,发现其中好多地方讲到了设计模式。自己都没有仔细研究过设计模式,所以有些地方还是看不懂。于是开始了另一本大部头的书《Head First 设计模式》。今天看了第一章,以一种非常轻松,循序渐进的方式将设计模式,很喜欢这本书。大部分内容和实例都摘抄自课本。

1、首先,我们在学习设计模式之前,需要对OO(面向对象编程)有一定的了解。主要为抽象、封装、多态和继承等概念。如果这些不了解,就没法学习设计模式。设计模式就我自己理解是一种思想,是在需求分析之后,架构设计和写代码之前考虑的事情。
2、策略模式:该书的第一章以Duck类及一系列的行为为例,说明了策略模式的思想。
首先我们会有鸭子类,鸭子有两种主要行为:飞行和鸣叫。但是对于不同类型的鸭子,飞行和鸣叫的方式都是不同的。因此,我们将鸭子类和鸭子的行为独立开来,设计一族算法,将不同的行为封装起来,同时让他们之间可以互相替代。这就是设计模式的主要思想。

其中用到了继承、接口的实现、组合。

3、下面我们以具体的例子说明策略模式。





鸭子会将飞行和呱呱叫的动作委托给别人处理,而不是在Duck类内部处理。


Duck类:
public class Duck {

	//这里用到了组合,每个鸭子都有飞行和鸣叫的行为,是一种has-a的关系
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	public Duck(){
		
	}

	public void performFly(){
		flyBehavior.fly();
	}
	
	public void performQuack(){
		quackBehavior.quack();
	}
	
	
	public void swim(){
		System.out.println("All ducks float,even decoys");
	}
	
}


该类其实是作为策略模式的客户端,会调用算法族中行为。

FlyBehavior接口
public interface FlyBehavior {
	//飞行行为
	public void fly();
}

QuackBehavior接口
public interface QuackBehavior {
	//叫声行为
    public void quack();
}


这个角色是所有的策略算法所需要的接口。


具体的算法族:
对于飞行行为有以下两个算法
public class FlyNoWay implements FlyBehavior{
	@Override
	public void fly() {

		System.out.println("I can't fly");
	}
}

public class FlyWithWings implements FlyBehavior{
	@Override
	public void fly() {
		System.out.println("I'm flying!!");
	}

}


对于鸣叫,有以下三个算法
public class Quack implements QuackBehavior{
	@Override
	public void quack() {

		System.out.println("Quack");
	}
}

public class Squeak implements QuackBehavior{
	@Override
	public void quack() {
		System.out.println("Squeak");
	}
}

public class MuteQuack implements QuackBehavior{
	@Override
	public void quack() {
		System.out.println("<<Silence>>");
	}
}


对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

测试程序:
public class MiniDuckSimulator {
	public static void main(String[] args){
		Duck mallard=new MallardDuck();
		mallard.performFly();
		mallard.performQuack();
}


测试结果:
I'm flying!!
Quack

4、可以通过setter方法在运行过程中动态的设定行为,在Duck类中添加如下方法:

/**
	 * 功能:动态添加飞行行为<br>
	 * @param flyBehavior the flyBehavior to set
	 */
	public void setFlyBehavior(FlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}
	/**
	 * 功能:动态添加鸣叫行为<br>
	 * @param quackBehavior the quackBehavior to set
	 */
	public void setQuackBehavior(QuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}

制造新的鸭子类型,模型鸭(ModelDuck)

public class ModelDuck extends Duck{
	public ModelDuck (){
		flyBehavior=new FlyNoWay();
		quackBehavior=new Quack();
	}

	public void display(){
		System.out.println("I'm a model duck");
	}
}


在飞行算法族中添加新的算法,即新的飞行方式:

public class FlyRocketPowered implements FlyBehavior{
	@Override
	public void fly() {
		System.out.println("I'm flying with a rocket!");
	}
}


测试类中添加如下代码:

                    
Duck model=new ModelDuck();
		model.performFly();
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();


可以看到测试结果如下:

I'm flying!!
Quack
I can't fly
I'm flying with a rocket!

从以上的例子中,我们发现:策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。

5、策略模式的优缺点

策略模式的优点
  (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

  (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

策略模式的缺点
  (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

6、在这一章中学到的设计原则:
(1)把应用中需要变化的地方独立出来,不要和不需要变化的代码混在一起
(2)针对接口编程,而不是针对实现编程
(3)多用组合,少用继承

  • 大小: 29.7 KB
分享到:
评论

相关推荐

    java设计模式--策略模式

    Java设计模式——策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式定义了一族算法,并将每一个算法封装起来,使它们可以互相替换。这种模式让算法的变化独立于使用算法的客户。 在Java中,...

    java设计模式之——策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。这种模式的核心是策略...

    Java与模式——源码

    《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...

    java设计模式——告诉新手一些不知道的东西

    在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...

    设计模式——单例模式

    **设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...

    设计模式——JAVA.docx

    ### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    JAVA设计模式.chm

    本资源“JAVA设计模式.chm”聚焦于一种重要的设计模式——工厂模式。工厂模式是面向对象设计中的一种经典模式,它在Java程序中扮演着核心角色。 工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的类...

    Java设计模式源代码——自己看pdf写的

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。在这个压缩包文件“DesignPatterns”中,很可能包含了各种Java设计模式的源代码实现。...

    Java设计模式教程-策略模式Java开发Java经验技

    在"Java设计模式教程——策略模式Java开发Java经验技巧共13页.pdf.zip"这份资料中,可能会详细讲解如何在实际项目中应用策略模式,包括但不限于以下内容: 1. 策略模式的基本结构和工作原理。 2. 如何定义策略接口...

    Java设计模式综合应用场景

    在这个实验报告中,主要讨论了三种设计模式——策略模式、装饰模式和工厂模式的综合运用,以解决一个国际电子商务系统的订单处理问题。 1. **策略模式**: 策略模式的核心在于将算法族封装在独立的可互换的策略类...

    java设计模式之——组合模式(结构型模式 )

    NULL 博文链接:https://lvwenwen.iteye.com/blog/1549415

    设计模式浅谈1——策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件工程中,我们经常遇到需要根据不同条件或场景动态地改变算法的情况。策略模式就是为了解决这类问题而诞生的,它允许我们用不同的策略(即算法)...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

Global site tag (gtag.js) - Google Analytics