策略模式

本文通过实例详细解析了策略模式的应用场景与实现方式,并对比了使用接口与抽象类的不同效果,帮助读者理解如何降低代码耦合度并实现良好的代码复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言废话

干开发也6年多了 水平只能说是工作环境中周围的人中 还算能干 (能干不是说技术好)

去年的时候已经感觉到了技术瓶颈(工作都是框架模式,没有人带,技术只能说是够企业开发用)

却因为忙碌的工作一直放下整块的时间去学习 零散的时间用来解决bug 或者看写blog  自己很少写

现在开始写blog的目的也是想塑造一下自己,重新回归小白的日子,blog 也是我诉苦的一个地方,80后到处漂,然后在一个城市发展 举目四望 确没有什么朋友 没有自己的圈子,活着也挺可悲的,在忙碌的工作中的感触就是不期待,没有期待,今天和明天没有什么不一样的.渣渣话说了 也说点正能量和的,  我会坚持健身  朋友送的瑜伽垫 我用了一年 也坚持了一年的健身, 当然也会因为懒 锻炼3355的, 但是真的听上瘾的 ,我不能 要求别人多美,但是我可以要求自己更好一点,不希望自己是一个手无握鸡之力的人,  麒麟臂已装备,公狗腰已成 可敢一战?

 

 

正文

以前面试的时候被问过一个interface 和abstract 的区别

当时定义和规范什么的能答出来  但是设计到思想上我就完全懵逼了,现在有零散的时间回来再学习一下设计模式

策略模式:

需求:

1.设计几只鸭子能说话,有不同的颜色

因为开始的需求都是共同的,所以设计成一个共同的父类,继承完事

2.需求变更---->>要加上一个会飞的能力(这个必须的有啊,无论是企业的业务拓展还是游戏的某项功能都要有这些的)

这个时候会有考虑加进父类里面,注意这里如果加进去会有的问题:  耦合度太高-->>不是那个鸭子都有飞的能力,如果不会飞 还需要在子累里面重写父类飞的方法

如果用接口的形式可以实现松耦合,把需要会飞的类加上继承这个飞的接口,代码如下:

 


public interface Fly {
	
	public void fly();
}


public class DuckAbstract {

	public void display(){
		
	}
	
	public void say(){
		System.out.println("呱呱叫");
	}
	public void swim(){
		System.out.println("游泳");
	}
}


public class DuckA extends DuckAbstract implements Fly {

	@Override
	public void display(){
		System.out.println("丑小鸭");
	}

	@Override
	public void fly() {
		System.out.println("我会飞");
	}
}


public class DuckB extends DuckAbstract implements Fly{

	@Override
	public void display() {
		System.out.println("小白鸭");
	}
	
	@Override
	public void fly() {
		System.out.println("我还不会飞");
	}
}

 

如上所述,但是问题又来了

实现了接口解决了搜耦合,但是说好的代码复用呢?

------------------------- strategy(策略模式) -------------------------


public interface Fly {
	
	public void fly();
}


//天鹅
public class Swan implements Fly {

	@Override
	public void fly() {
		System.out.println("天鹅会飞");
	}

}


//旱鸭
public class DryDuck implements Fly {

	@Override
	public void fly() {
		System.out.println("旱鸭不会飞");
	}

}

public abstract class Duck {
    // 看到这里我怎么感觉都很眼熟?是不是在ctronler里面常见的service?,
    //这里的fly有不同的实现类: 实现了不同的行为,而ctronler里面的service 是注入进来的
	Fly fly;
	public abstract void display();

	public void say() {
		System.out.println("呱呱叫");
	}

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

// 测试 策略模式
public class TestStrategy {

	public static void main(String[] args) {
		DuckDry a = new DuckDry();
		DuckSwan b = new DuckSwan();
		a.say();
		a.fly();
		b.say();
		b.fly();
	}

}

// 输出结果
呱呱叫
旱鸭不会飞
呱呱叫
天鹅会飞

 

这里的旱鸭和天鹅我理解为:行为抽象的具体实现

抽象的是鸭子

抽象的内容是:鸭子会飞的行为

具体实现的是能飞不能飞

________________________________

总结

这里解决了第一段代码的松耦合,又解决实现代码中的代码复用问题

问题:

如果再来一组新的行为怎么办?

比如: 新加一组跳舞的动作:有会爵士的,有会拉丁,有会交际的

解决:

新来一个借口 写dance()方法  然后 实现这个方法?

学完策略模式之后你再这样想 就白学了

道理是一样的  写多个对应的dance实现类  实现 dance 接口

在实体类里面定义这个实现类的子类的类型(对应的功能,比如是拉丁舞)

 

这样在调用该类的dance方法时 自然会调用对应的dance方法

结束

 

本人根据网贴 自己实践手打,欢迎指正

转载于:https://my.oschina.net/osmoon/blog/917999

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值