`

深入浅出设计模式一——Duck设计(策略模式)

阅读更多

 

以下为针对上图所列代码:

package com.lwf.design.learn;

public abstract class Duck {

	Flyable flyable;
	Quackable quackable;
	
	public void swim(){
		System.out.println("duck is swim");
	}
	public abstract void display();
	
	public void setFlayable(Flyable flyable){
		this.flyable = flyable;
	}
	
	public void setQuackable(Quackable quackable){
		this.quackable = quackable;
	}
	
	public void perFormFly(){
		flyable.fly();
	}
	
	public void perFormQuack(){
		quackable.quack();
	}
	
}

 

 

package com.lwf.design.learn;

public class SubDuck extends Duck {

	public SubDuck(){
		flyable = new NomorFly();
		quackable = new GaQuack();
	}
	public void display(){
		System.out.println("subberDuck is display");
	}
	
	
	public static void main(String[] args) {
		SubDuck s = new SubDuck();
		s.display();
		s.swim();
		s.perFormFly();
		s.perFormQuack();
		
		s.setFlayable(new HighFly());
		s.perFormFly();
		
//		Quackable quackable = new GaQuack();
//		s.quackable = quackable;
//		s.perFormQuack();
	}
}

 

 

package com.lwf.design.learn;

public interface Flyable {

	public void fly();
}

 

 

package com.lwf.design.learn;

public interface Quackable {
	public void quack();
}

 

package com.lwf.design.learn;

public class NomorFly implements Flyable {

	public void fly() {
		System.out.println("Normal fly");
	}

}

 

package com.lwf.design.learn;

public class HighFly implements Flyable {

	public void fly() {
		System.out.println("HighFly fly");
	}

}

 

 

package com.lwf.design.learn;

public class GaQuack implements Quackable {

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

}

 

 

package com.lwf.design.learn;

public class GuQuack implements Quackable {

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

}

 

 

设计原则:

继承会使所有子类都具有所父类一样的特性,如果使用覆盖,那么子类繁多的时候每个类都要使用覆盖。。
接口会使所有子类都实现其方法,如果子类繁多且实现的方法基本一样,那么怎么办?还使用接口吗?如果以后维护,需要更改这一特性,那么所有子类都需要修改,麻烦。
设计原则一:封装变化即找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
实际上就是把会变化的部分取出来并封装起来,以便以后轻易的改动或扩充此部分。
设计原则二:针对接口编程,而不是针对实现编程
具体的在Duck类的设计之中,将Duck与其可能变化的行为分开,即将Fly抽象成接口,并有它自己的实现类。只需在Duck类中增加Fly属性及设置该属性的方法即可。
这样利用了Duck类本身的继承及Fly类的继承特性,实际上这样有了继承的"复用"好处,而没有继承所带来的包袱。

设计原则三:多用组合,少用继承
在Duck类的设计中,类关系存在继承(is-a),组合(has-a)和实现(implements),使用组合能减少继承带来的包袱,还可以动态的改变行为。对于Duck的飞行行为和叫的行为,我们可以分别看成是算法簇,比如:我们把飞行行为抽象为接口,它可以有多个实现类,这些实现类可以相互替换,从而我们可以动态的改变行为。

策略模式的定义:
     定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。

 

UML图:

  

分享到:
评论

相关推荐

    深入浅出设计模式中文第一章

    ### 设计模式:深入浅出理解与应用 #### 引言:从代码复用到经验复用 在软件工程领域,随着项目的复杂度增加,如何有效地管理代码、提高开发效率和减少错误成为开发者关注的核心议题。传统的代码复用虽然能够解决...

    深入浅出设计模式

    ### 深入浅出设计模式 #### 一、引言 在软件开发领域,设计模式是一种被广泛接受和使用的编程技巧,它可以帮助开发者解决常见的软件设计问题。本文通过一个具体的例子——“模拟鸭子”应用程序,来阐述设计模式的...

    深入浅出设计模式之策略模式总结(一)附例子

    在这个“深入浅出设计模式之策略模式总结(一)”中,我们将深入探讨策略模式的基本概念、工作原理以及如何通过实例来应用它。 策略模式的核心是将算法封装到具有共同接口的独立类中,使得它们可以相互替换。在描述...

    深入浅出设计模式第一章中文

    ### 深入浅出设计模式第一章中文 #### 引言 在软件工程领域,设计模式作为一种被广泛接受和使用的编程技巧,对于提高代码的可读性、可维护性和可扩展性具有重要意义。本章主要介绍了设计模式的概念、为什么需要使用...

    深入浅出设计模式(C#版)--策略模式--示例代码

    例如,在"深入浅出设计模式(C#版)--策略模式--示例代码"中,可能会有一个`IDuck`接口,它定义了飞、叫等基本行为。然后有多个具体的鸭子类型,如`MallardDuck`、`RedheadDuck`等,每个类型可能有不同的飞行和叫声...

    深入浅出设计模式培训课件_2

    ### 深入浅出设计模式培训课件_2 #### 一、设计模式概述 设计模式是在软件设计和开发过程中不断总结出的、反映某一类设计问题的解决方案。它们通过对现实生活中某些常见问题的抽象,提供了一套成熟且经过验证的...

    设计模式解读之一: 策略模式——鸭子游戏.doc

    设计模式解读之一:策略模式——鸭子游戏 策略模式是指定义amily of algorithms,encapsulate each one,and make them interchangeable,这种模式让我们可以在不修改原始代码的情况下,灵活地更换算法。下面我们来...

    策略设计模式简单代码实现

    策略设计模式是软件工程中的一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的...

    设计模式解读之--策略模式.pdf

    ### 设计模式解读之策略模式 #### 模式定义与核心思想 策略模式是一种行为设计模式,它使得算法可以独立于使用它的客户而变化。...掌握策略模式,能够帮助开发者更好地设计出既高效又易于维护的软件系统。

    java设计模式(23种设计模式大全)

    根据提供的标题、描述以及部分内容,本文将深入探讨Java设计模式,并着重分析23种常见的设计模式,以帮助Java程序员更好地理解和应用这些模式。 ### Java设计模式概述 Java设计模式是面向对象软件设计的一种通用可...

    Vue深入浅出从基础到项目实践课程.txt打包整理.zip

    本课程"Vue深入浅出从基础到项目实践"旨在帮助开发者从零开始掌握Vue.js,并通过实际项目加深理解。 首先,我们要了解Vue的基础知识。Vue的安装可以通过CDN链接引入,或者使用npm进行全局或局部安装。在HTML中,...

    head first 设计模式 策略模式 C++ 代码

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在《Head First 设计模式》这本书中,策略模式被详细地讲解,并通过C++代码实现来加深理解。策略模式的核心思想是定义一系列的算法,并将每一个算法...

    C#,设计模式,策略模式,鸭子,

    策略模式是一种行为设计模式,允许我们在运行时根据需要改变一个对象的行为。 策略模式的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。这种模式让算法的变化独立于使用算法的客户。在...

    [行为模式] head first 设计模式之策略模式(strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来选择不同算法或策略的情况。策略模式提供了一种将算法封装到独立的可互换策略类中的方式,使得...

    《Head First设计模式》读书笔记 -- (第一章)策略模式

    《Head First设计模式》是软件开发领域的一本经典著作,其深入浅出地介绍了23种设计模式。第一章主要讲解的是策略模式,这是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式的核心思想是定义一系列算法...

    设计模式介绍

    正如标题所言,“设计模式介绍”,本文将深入探讨设计模式的重要性和应用,特别是以C#语言为背景,通过一个具体的案例——模拟鸭子游戏“SimUDuck”——来阐述设计模式的原理和优势。 #### 设计模式的核心概念 ...

    java 策略模式实例(duck)

    1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,...

Global site tag (gtag.js) - Google Analytics