策略模式

最近工作都很浮躁,也没怎么看书和学习,觉得这样不好,最近慢慢梳理一下学习的东西,温故知新,废话不多说,下面我们开始讲第一个设计模式——策略模式

记得head first设计模式有这样一句话,策略模式就是一种组合的方案,将接口和抽象类组合在一起从而解决代码不灵活和代码重复的问题,“有一个比是一个好”

这样来说,我们都学过面向对象设计,万物皆对象(当然不是指女票),一个对象有很多属性,比如说人,有名字,身高,体重,年龄等属性,这些都是这个对象的状态,当然人有很多行为,比如跑,吃,说话等,我们在设计一个对象的时候就要尽量将对象的属性和行为分开,属性放到抽象类里面,这样容易扩展属性,比如机器人,他也是抽象人的一种,它拥有各种零件,螺丝属性来那个,这些人没有的,我们抽取公共的属性放到抽象类,就像实现可扩展,行为放到接口里面,因为这些行为不只是人专有的,动物也有,只是方式不同,比如人是两只脚跑步,动物是四只脚,有的机器人是两个轮子跑,具体怎么跑,我们实现同一个接口,而将接口作为抽象类的一个属性,就可以动态的改变行为的方式,我们看看下面的代码

首先我创建一个人类的抽象类:

public abstract class Man {

    private  String name;

    private Say say;


    public Man(String name, Say say) {
        this.name = name;
        this.say = say;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Say getSay() {
        return say;
    }

    public void setSay(Say say) {
        this.say = say;
    }

    public abstract void show();


    public void say(){
        say.saySomeThing();
    }

}

其中Say是一个接口,就是讲话的方式

public interface Say {
    void saySomeThing();
}

然后Say有两个实现

public class Speak implements Say{
    @Override
    public void saySomeThing() {
        System.out.println("i am a man, i can speak");
    }
}

 

public class NoSound implements Say {
    
    @Override
    public void saySomeThing() {
        System.out.println("I'm a doll, i cant't speak");
    }
}

这两种实现就是具体讲话的两种策略,所以策略模式比较适用于策略比较固定的情况

然后我们实现一个具体的人

 

public class People extends Man{
    public People(String name, Say say) {
        super(name, say);
    }

    @Override
    public void show() {
        System.out.println("I'm a man");
    }
}

这样一个活生生的人就出现了

现在我们让这个人说话

public static void main(String[] args) {
    Say say = new Speak();
    People people = new Man("张山",say);
    people.say();
    people.setSay(new NoSound());
    people.say();
}

我们多了一个set策略的方法,就可以动态去改变策略了,运行结果如下

i am a man, i can speak
I'm a doll, i cant't speak

总而言之,策略是对同一种行为不同实现的封装,在各大框架上面都有采用,比如对不同数据库的连接,日志框架中的slfj

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值