策略模式(Strategy)

本文详细介绍了策略模式的概念及其在Java中的具体应用案例。通过一个图表生成的例子展示了如何将不同的算法封装成独立的类,并且可以在运行时进行切换。此外,还讨论了Comparable与Comparator接口作为策略模式的实际应用。

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

策略模式(Strategy

我很苦恼啊,UML图没发显示,我添加到附件了

定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

 

策略模式要点:

①       封装算法

②       算法可以相互替换

 

UML

               

这个《java设计模式》一书中的图例。

 

Context:应用上下文类,持有一个Strategy的对象

Strategy:策略的接口

ConcreteStrategy1,2:接口的实现类(即不同的可以相互替代的算法

 

应用

报表中要使用不同的图案表示同样的数据。

package com.dp;

 

//Strategy

public interface DiagramStrategy {

 

      void generateDiagram();

}

 

//ConcreteStrategy

public class CuboidDiagramStrategy implements DiagramStrategy {

 

      @Override

      public void generateDiagram() {

            // TODO Auto-generated method stub

 

            System.out.println("输出立方形图形(CuboidDiagramStrategy");

      }

 

}

 

public class CylinderDiagramStrategy implements DiagramStrategy {

 

      @Override

      public void generateDiagram() {

            // TODO Auto-generated method stub

 

            System.out.println("输出圆柱形图形(CylinderDiagram");

      }

 

}

 

//Context应用场景

 

public class ReportForm {

 

      //生成报表的策略

      private DiagramStrategy strategy;

     

      public ReportForm(DiagramStrategy strategy) {

            super();

            this.strategy = strategy;

      }

 

      //产生报表中的图形

      public void generateDiagram(){

            strategy.generateDiagram();

      }

     

     

      public DiagramStrategy getStrategy() {

            return strategy;

      }

      //设置产生图形的策略

      public void setStrategy(DiagramStrategy strategy) {

            this.strategy = strategy;

      }

     

}

 

 

javaapiComparableComparatorStrategy的一个应用

Package java.uitl;

public interface Comparator<T> {

    int compare(T o1, T o2);

    boolean equals(Object obj);

}

 

 

package java.lang;

 

public interface Comparable<T> {

    public int compareTo(T o);

}

 

ComparatorComparable的简单应用

 

 

UML

 

 

即设计两个接口,ComparableComparator,有一个类Cat,它有两个属性HeightWeight,我们可以按照Height或者Weight给他们分辨大小,因此我们可以有两种算法。这样就可以使用Strategy类了。

 

/**

 * 按体重比较

 * @author Cody_408516

 *

 */

public class CatWeightComparator implements Comparator<Cat> {

 

      @Override

      public int compare(Cat o1, Cat o2) {

            if(o1.getWeight() > o2.getWeight()) return 1;

            else if(o1.getWeight() < o2.getWeight()) return -1;

            return 0;

      }

 

}

 

import com.model.Cat;

/**

 * 按身高比较

 * @author Cody_408516

 *

 */

public class CatHeightComparator implements Comparator<Cat> {

 

      @Override

      public int compare(Cat o1, Cat o2) {

            if(o1.getHeight()> o2.getHeight()) return 1;

            else if(o1.getHeight() < o2.getHeight()) return -1;

            return 0;

      }

 

}

 

 

public class Cat implements Comparable<Cat> {

 

      //比较器

      private Comparator<Cat> comparator;

      //构造器

      public Cat(float height, float weight) {

            super();

//          this.comparator = comparator;

            this.height = height;

            this.weight = weight;

      }

 

      //猫的属性

      private float height;

      private float weight;

     

      @Override

      public int compareTo(Cat o) {

            //返回比较的值

            return comparator.compare(this, o);

      }

 

      public float getHeight() {

            return height;

      }

 

      public void setHeight(float height) {

            this.height = height;

      }

 

      public float getWeight() {

            return weight;

      }

 

      public void setWeight(float

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值