网站重大建设项目公开发布制度,广州营销网站建设,局网站建设情况,深圳集团网站开发网站开发公司编写鸭子项目#xff0c;具体要求如下#xff1a; 1#xff09; 有各种鸭子#xff08;比如 野鸭、北京鸭#xff0c;水鸭等#xff0c;鸭子有各种行为#xff0c;比如 叫#xff0c;飞行等#xff09; 2#xff09;显示鸭子的信息 传统方案解决鸭子问题 1#xff0…编写鸭子项目具体要求如下 1 有各种鸭子比如 野鸭、北京鸭水鸭等鸭子有各种行为比如 叫飞行等 2显示鸭子的信息 传统方案解决鸭子问题 1 传统的设计方法类图2 代码实现 创建一个 maven 项目 strategy 在项目路径下创建抽象父类 cn.baisee.strategy.Duckpublic abstract class Duck {
/**
* 显示鸭子的信息
*/
public abstract void display();
/**
* 鸭子行为
*/
public void fly() {
System.out.println(鸭子会飞);
}
/**
* 鸭子行为
*/
public void quack() {
System.out.println(鸭子会叫);
}
}
创建野鸭子子类 cn.xs.strategy.WildDuck public class WildDuck extends Duck {
/**
* 显示鸭子信息
*/
public void display() {
System.out.println( 这是野鸭子 );
}
}
创建北京鸭子类 cn.xs.strategy.PekingDuck public class PekingDuck extends Duck {
/**
* 显示鸭子信息
*/
public void display() {
System.out.println( 这是北京鸭 );
}
/**
* 因为北京鸭不能飞翔所以需要重写 fly
*/
Override
public void fly() {
System.out.println(北京鸭不能飞翔);
}
}
创建玩具鸭子类 cn.xs.strategy.ToyDuck public class ToyDuck extends Duck {
/**
* 显示鸭子信息
*/
public void display() {
System.out.println( 这是玩具鸭 );
}
/**
* 因为玩具鸭不能飞翔所以需要重写 fly
*/
Override
public void fly() {
System.out.println(玩具鸭不能飞翔);
}
/**
* 因为玩具鸭不能叫所以需要重写 quack
*/
Override
public void quack() {
System.out.println(玩具鸭不能叫);
}
}
分析传统方案 1其它鸭子都继承了 Duck 类所以 fly 让所有子类都会飞了这是不正确的 2上面说的 1 的问题其实是继承带来的问题对类的局部改动尤其超类的局部改动会影响其他 部分会有溢出效应 3为了改进 1 问题我们可以通过覆盖 fly 方法来解决 覆盖解决4问题又来了如果我们有一个玩具鸭子 ToyDuck 这样就需要 ToyDuck 去覆盖 Duck 的所有实现的 方法 策略模式 基本介绍 1策略模式Strategy Pattern中定义算法族分别封装起来让他们之间可以互相替换此模式 让算法的变化独立于使用算法的客户 2这算法体现了几个设计原则第一、把变化的代码从不变的代码中分离出来第二、针对接口编程而 不是具体类定义了策略接口第三、所用组合/聚合少用继承客户通过组合方式使用策略 策略模式解决鸭子问题 分析分别定义封装行为接口实现算法族超类里放行为接口对象在子类里具体设定飞行对象。原 则就是分离变化部分封装接口基于接口编程各种功能此模式让行为的变化独立于算法的使用者 针对飞行这个行为我们定义策略接口 cn.xs.strategy.FlyBehavior public interface FlyBehavior {
/**
* 抽象的飞行方法
*/
void fly();
}
定义三种飞行行为实现飞行策略接口 第一个飞行能力很好的行为 cn.xs.strategy.GoodFlyBehavior public class GoodFlyBehavior implements FlyBehavior {
/**
* 实现飞行方法
*/
public void fly() {
System.out.println(飞翔技术高超);
}
}
第二个飞行能力不好的行为 cn.xs.strategy.BadFlyBehavior public class BadFlyBehavior implements FlyBehavior {
/**
* 实现飞行方法
*/
public void fly() {
System.out.println(飞翔能力一般);
}
}
第三个没有飞行能力 cn.xs.strategy.NoFlyBehavior public class NoFlyBehavior implements FlyBehavior {
/**
* 实现飞行方法
*/
public void fly() {
System.out.println(没有飞行能力);
}
}
将策略接口聚合进 Duck 类public abstract class Duck {
/* 聚合飞翔行为策略接口 */
protected FlyBehavior flyBehavior;
/**
* 显示鸭子的信息
*/
public abstract void display();
/**
* 鸭子行为
*/
public void fly() {
if (flyBehavior ! null) {
flyBehavior.fly();
}
}
/**
* 鸭子行为
*/
public void quack() {
System.out.println(鸭子会叫);
}
}
在 Duck 子类中将 FlyBeHavior 初始化 野鸭子 /**
* 初始化飞行行为
*/
public WildDuck() {
flyBehavior new GoodFlyBehavior();
}
北京鸭/**
* 初始化飞行行为
*/
public PekingDuck() {
flyBehavior new NoFlyBehavior();
}
玩具鸭/**
* 初始化飞行行为
*/
public ToyDuck() {
flyBehavior new NoFlyBehavior();
}
去掉所有子类中重写的 fly 方法 新建cn.xs.strategy.Client 测试类进行测试 public class Client {
/**
* 测试方法
*
* param args
*/
public static void main(String[] args) {
System.out.println(野鸭子);
WildDuck wildDuck new WildDuck();
wildDuck.fly();
System.out.println(北京鸭);
PekingDuck pekingDuck new PekingDuck();
pekingDuck.fly();
System.out.println(玩具鸭);
ToyDuck toyDuck new ToyDuck();
toyDuck.fly();
}
}
运行 main 方法策略模式在 jdk 中的使用 1jdk 的 Arrays 的 Comparator 就使用了策略模式 2代码演示Integer[] arr {1,5,3,7,8};
Arrays.sort(arr, new ComparatorInteger() {
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
函数式接口 Comparator 就是一个策略接口compare 就是一个排序的行为我们可以自己定义不同的 实现来对数组进行各种排序不同的排序规则就是不同的行为就跟鸭子的飞行能力一样 策略模式的注意事项和细节 1策略模式的关键是分析项目中变化部分与不变部分 2策略模式的核心思想多用组合/聚合 少用继承用行为类组合而不是行为的继承。更具弹性 3体现了 对修改关闭对扩展开放 原则客户端增加行为不用修改原有代码只要添加一种策略或者行为即可避免了使用多重转移语句if...else if...else 4提供了可以替换继承关系的方法策略模式将算法封装在独立的 Strategy 类中使得你可以独立于其 Context 改变它使它易于切换、易于理解、易于扩展 5需要注意的是每添加一个策略就要增加一个类当策略过多是会导致类数目庞大