设计模式之-策略设计模式(一种代码思想)

如果一个方法的参数是一个接口,那么他本质上需要的是一个实现,也就是要具体化,针对这个主要有以下的几种:

  1.如果这个接口有具体的实现,那么直接new  A()    ---->假如A是一个具体的实现

   2.如果这个接口没有一个具体的实现,那么分为以下几种方式:

          补充一个问题:

             接口中有静态方法和默认方法的好处是:把实现这个接口的类的共性的代码放在接口中,避免了代码的冗余度和可读性

            1.如果这个接口是一个函数式接口(什么是函数式接口:1.一个接口中只有一个抽象方法,2.用这个注解标注的

@FunctionalInterface   3.如果没有标注,那么如果只有一个抽象方法,jvm会自动的标识为函数式接口)  可以用下面的两种方法实现

                   1.匿名内部类的方法:

                   2.lamdba表达式实现

                   而这两个恒等的条件是:函数式接口.

                 3注意函数推导和lamdba表达式的替换使用;

 3.参数行为化:策略设计模式的一种思想体现

下面是关于策略设计模式的代码以及java基础实质性应用的补充:

package com.zhoujianpeng.project.Head_First;

/**
 * 什么是抽象类:
 * 为什么要用抽象类:
 * 把某一类事物的共性行为和特征抽取出来
 * 记住:一定是有某个共性的特征的,才可以这样实现,如果没有共性的特征,一般不要这样去实现
 * 所谓的组合的思想:
 * 就是将各个类作为成员变量,这样的一种引用关系,进行成员变量之间的组合
 * <p>
 * 覆盖和重载之间的关系:
 * 具有相同的的行为,但是行为的体现关系不一样,如果子类和父类具有相同的关系
 * 那么 super.fly(); 直接调用父类的方法,记住:继承是子类持有父类的特征,但是不能修改父类的特征
 * 并且可以有自己的特性,但是他们的行为是一样的,而这个行为指的就是方法,而非具体的方法体;
 */
public abstract class Duck {

    protected FlyBehavior flyBehavior;
    protected QuackBehavior quackBehavior;

    public void swim() {
        System.out.println("All duck can swim!");
    }

    public abstract void display();

    /**
     * 动态改变飞行行为
     */
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    /**
     * 动态改变鸭叫行为
     */
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    public void performFly() {
        flyBehavior.fly();
    }

    public void performQuack() {
        quackBehavior.quack();
    }
}

 

package com.zhoujianpeng.project.Head_First;


public interface FlyBehavior {
    public void fly();
}

 

package com.zhoujianpeng.project.Head_First;

public class FlyNoWay implements FlyBehavior {
    public void fly(){
        System.out.println("我不能飞……");
    }
}

 

package com.zhoujianpeng.project.Head_First;

public class FlyWithRocket implements FlyBehavior{

    public void fly(){
        System.out.println("带上火箭筒,飞~~~");
    }
}

 

package com.zhoujianpeng.project.Head_First;

public class FlyWithWings implements FlyBehavior{

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

 

package com.zhoujianpeng.project.Head_First;

public class Main {
    public static void main(String[] args) {

        //组合模式---多态的进行数据的初始化
        Duck mallarDuck = new MallarDuck();
        Duck redHeadDuck = new RedHeadDuck();
        Duck rubberDuck = new RubberDuck();

        mallarDuck.display();
        mallarDuck.performFly();
        mallarDuck.performQuack();
        System.out.println("========================");
        redHeadDuck.display();
        redHeadDuck.performFly();
        redHeadDuck.performQuack();
        System.out.println("========================");
        rubberDuck.display();
        rubberDuck.performFly();
        rubberDuck.performQuack();

        //改变行为特点
        rubberDuck.setFlyBehavior(new FlyWithRocket());
        rubberDuck.setQuackBehavior(new MuteQuack());
        rubberDuck.performFly();
        rubberDuck.performQuack();

    }
}

 

package com.zhoujianpeng.project.Head_First;

public class MallarDuck extends Duck {
    //数据初始化,具体的行为在实例初始化的时候已近完成了;
    public MallarDuck() {
        //可飞
        flyBehavior = new FlyWithWings();
        //呱呱叫
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("看着像绿头鸭");
    }
}

 

package com.zhoujianpeng.project.Head_First;

public class MuteQuack implements QuackBehavior{
    public void quack(){
        System.out.println("我不会叫……");
    }
}

 

package com.zhoujianpeng.project.Head_First;

public class Quack implements QuackBehavior {
    public void quack(){
        System.out.println("呱呱呱~");
    }
}

 

package com.zhoujianpeng.project.Head_First;

public interface QuackBehavior {
    public void quack();
}

 

package com.zhoujianpeng.project.Head_First;

public class RedHeadDuck extends Duck {
    public RedHeadDuck() {
        //可飞
        flyBehavior = new FlyWithWings();
        //呱呱叫
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("看着像红头鸭");
    }
}

 

package com.zhoujianpeng.project.Head_First;

public class RubberDuck extends Duck {
    public RubberDuck() {
        //不会飞
        flyBehavior = new FlyNoWay();
        //吱吱叫
        quackBehavior = new Squeak();
    }
    @Override
    public void display() {
        System.out.println("看着像橡皮鸭");
    }
}

package com.zhoujianpeng.project.Head_First;

public class Squeak  implements  QuackBehavior{

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

  

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值