java设计模式的作用_java设计模式之——策略模式有什么好处?

1、策略模式有什么好处?

策略模式的好处在于你可以动态的改变对象的行为。

2、设计原则

设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(C++中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为。下面是一个例子。

策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响 到客户端的情况下发生变化。通常,策略模式适用于当一个应用程序需要实现一种特定的服务或者功能,而且该程序有多种实现方式时使用。

3、策略模式中有三个对象:

(1) 环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。

(2) 抽象策略对象:它可由接口或抽象类来实现。

(3) 具体策略对象:它封装了实现同不功能的不同算法。

利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择由环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

5,应用场景举例:

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开能解决棘手问题,嘿,还别说,真解决了大问题,搞到最后是周瑜陪了夫人又折兵,那咱们先看看这个场景是什么样子的。

先说说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是亮哥给的,妙计放在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊取出妙计,执行,然后获胜。用java程序怎么表现这些呢?

那我们先来看看图?

9bbe36a66797ba365aa01954c3839b4c.png

三个妙计是同一类型的东西,那咱就写个接口:

Java代码

package com.yangguangfu.strategy;

* @author trygf521@126.com:阿福

* 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。

public interface IStrategy {

//每个锦囊妙计都是一个可执行的算法。

public void operate();

然后再写三个实现类,有三个妙计嘛:

妙计一:初到吴国:

Java代码

package com.yangguangfu.strategy;

* @author trygf521@126.com:阿福

* 找乔国老帮忙,使孙权不能杀刘备。

public class BackDoor implements IStrategy {

@Override

public void operate() {

System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");

妙计二:求吴国太开个绿灯,放行:

Java代码

package com.yangguangfu.strategy;

* @author trygf521@126.com:阿福

* 求吴国太开个绿灯。

public class GivenGreenLight implements IStrategy {

@Override

public void operate() {

System.out.println("求吴国太开个绿灯,放行!");

妙计三:孙夫人断后,挡住追兵:

Java代码

package com.yangguangfu.strategy;

* @author trygf521@126.com:阿福

* 孙夫人断后,挡住追兵。

public class BlackEnemy implements IStrategy {

@Override

public void operate() {

System.out.println("孙夫人断后,挡住追兵...");

好了,大家看看,三个妙计是有了,那需要有个地方放妙计啊,放锦囊里:

Java代码

package com.yangguangfu.strategy;

* @author trygf521@126.com:阿福

public class Context {

private IStrategy strategy;

//构造函数,要你使用哪个妙计

public Context(IStrategy strategy){

this.strategy = strategy;

public void operate(){

this.strategy.operate();

然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列,还想着娶纯情少女的,色咪咪的刘备老爷子去入赘了,嗨,还别说,亮哥的三个妙计还真不错,瞧瞧:

Java代码

package com.yangguangfu.strategy;

public class ZhaoYun {

* 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计

public static void main(String[] args) {

Context context;

//刚到吴国的时候拆开第一个

System.out.println("----------刚刚到吴国的时候拆开第一个---------------");

context = new Context(new BackDoor());

context.operate();//拆开执行

System.out.println("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n");

//当刘备乐不思蜀时,拆开第二个

System.out.println("----------刘备乐不思蜀,拆第二个了---------------");

context = new Context(new GivenGreenLight());

context.operate();//拆开执行

System.out.println("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n");

//孙权的小追兵了,咋办?拆开第三个锦囊

System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");

context = new Context(new BlackEnemy());

context.operate();//拆开执行

System.out.println("\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n");

后话:就这三招,搞得的周郎是“赔了夫人又折兵”呀!这就是策略模式,高内聚低耦合的特点也表现出来了,还有一个就是扩展性,也就是OCP原则,策略类可以继续添加下去气,只是修改Context.java就可以了,这个不多说了,自己领会吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰者模式是一种结构型设计模式,它允许你动态地向对象添加行为。通过将对象放入装饰器中,可以在运行时更改对象的行为。 在咖啡馆中,装饰者模式可以用于根据顾客的选择动态地添加配料并计算价格。我们可以创建一个基础咖啡,然后创建多个装饰器来添加不同的配料,并且每个装饰器都可以计算自己的价格。 下面是一个简单的示例代码: ```java // 基础咖啡 public abstract class Coffee { protected String description = "Unknown coffee"; public String getDescription() { return description; } public abstract double cost(); } // 浓缩咖啡 public class Espresso extends Coffee { public Espresso() { description = "Espresso"; } public double cost() { return 1.99; } } // 装饰器,用于添加牛奶 public class Milk extends Coffee { private Coffee coffee; public Milk(Coffee coffee) { this.coffee = coffee; } public String getDescription() { return coffee.getDescription() + ", Milk"; } public double cost() { return coffee.cost() + 0.5; } } // 装饰器,用于添加摩卡 public class Mocha extends Coffee { private Coffee coffee; public Mocha(Coffee coffee) { this.coffee = coffee; } public String getDescription() { return coffee.getDescription() + ", Mocha"; } public double cost() { return coffee.cost() + 0.8; } } // 测试代码 public static void main(String[] args) { Coffee coffee = new Espresso(); // 创建一个浓缩咖啡 coffee = new Milk(coffee); // 添加牛奶 coffee = new Mocha(coffee); // 添加摩卡 System.out.println(coffee.getDescription() + " $" + coffee.cost()); } ``` 输出结果为:`Espresso, Milk, Mocha $3.29` 在这个例子中,我们创建了一个基础咖啡 `Coffee`,并且创建了两个装饰器 `Milk` 和 `Mocha`。我们可以通过创建不同的装饰器来添加不同的配料。最后,我们创建了一个浓缩咖啡对象 `Espresso`,并且动态地添加了牛奶和摩卡,最终计算出了价格。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值