展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

传统方式解决鸭子问题

  • 问题描述
1) 有各种鸭子(比如 野鸭、北京鸭、水鸭等, 鸭子有各种行为,比如 叫、飞行等)
2) 显示鸭子的信息

  • 问题类图

  • 代码实现

package com.atguigu.strategy;
public abstract class Duck {

	public Duck() {
	}

	public abstract void display();//显示鸭子信息
	
	public void quack() {
		System.out.println("鸭子嘎嘎叫~~");
	}
	
	public void swim() {
		System.out.println("鸭子会游泳~~");
	}
	
	public void fly() {
		System.out.println("鸭子会飞翔~~~");
	}
	
}

package com.atguigu.strategy;
public class WildDuck extends Duck {

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println(" 这是野鸭 ");
	}

}

package com.atguigu.strategy;
public class PekingDuck extends Duck {

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("~~北京鸭~~~");
	}
	
	//因为北京鸭不能飞翔,因此需要重写fly
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("北京鸭不能飞翔");
	}

}

package com.atguigu.strategy;
public class ToyDuck extends Duck{

	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("玩具鸭");
	}

	//需要重写父类的所有方法
	public void quack() {
		System.out.println("玩具鸭不能叫~~");
	}
	
	public void swim() {
		System.out.println("玩具鸭不会游泳~~");
	}
	
	public void fly() {
		System.out.println("玩具鸭不会飞翔~~~");
	}
}

package com.atguigu.strategy;
public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//测试
	}

}
  • 传统方式利弊
1) 其它鸭子,都继承了Duck类,所以fly让所有子类都会飞了,这是不正确的
2) 上面说的1 的问题,其实是继承带来的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。会有溢出效应
3) 为了改进1问题,我们可以通过覆盖fly 方法来解决 => 覆盖解决
4) 问题又来了,如果我们有一个玩具鸭子ToyDuck, 这样就需要ToyDuck去覆盖Duck的所有实现的方法 => 解决思路 策略模式 (strategy pattern)
posted @ 2022-09-02 10:03  DogLeftover  阅读(30)  评论(0编辑  收藏  举报