设计模式之策略模式

 

策略模式

目录

策略模式

一、从简单的模拟鸭子应用开始

二、改进版的鸭子应用

三、采用策略模式改进后的鸭子应用

3.1 策略模式中包含的设计原则

3.2 具体的方法

四、总结


一、从简单的模拟鸭子应用开始

Joe上班的公司做了一套模拟鸭子的游戏:SimUDuck。游戏中的各种鸭子一边游泳戏水,一边呱呱叫。此系统内部设计使用了标准的OO技术,设计了一个鸭子超累,并且让各种鸭子继承此超类。

              

public abstract class Duck {     //抽象类

	public Duck() {
	}

	public void Quack() {
		System.out.println("~~gaga~~");
	}

	public abstract void display();    //抽象方法,每个子类都必须实现该方法

	public void swim() {
		System.out.println("~~im swim~~");
	}
	
	
	public void Fly() {    //添加一个fly()方法
			System.out.println("~~im fly~~");
		}
	
	
public class RedHeadDuck extends Duck {

	@Override
	public void display() {
		System.out.println("**RedHead**");
	}

此时项目中需要添加新的功能,比说要程序中需要有会飞的鸭子,此时Joe在Duck类上添加了fly方法,这种方法有个弊端,所有的子类都会包含有fly方法,并非所有的duck类的子类都会飞。

Joe想到一个方法:用覆盖的方式把不会飞的子类中fly方法覆盖掉


public class GreenHeadDuck extends Duck {
    //不会飞的鸭子

	@Override
	public void display() {
		System.out.println("**GreenHead**");
	}

	public void Fly() {    //覆盖
		System.out.println("~~no fly~~");
	}
	
	
	
}

用继承的方式来提供Duck的行为,会导致以下缺点:

1.代码会在多个子类中重复

2.运行时的行为不容易改变

3.无法得知所有鸭子的全部行为,并且鸭子不能够同时飞又叫

4.改变Duck类代码,会影响其他鸭子一起发生改变

二、改进版的鸭子应用

Joe把fly方法抽取出来,放进一个flyable接口中,这样一来,只有会飞的鸭子才实现此接口。同样的他也可以设计一个Quackable接口,并不是所有的鸭子都会叫。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值