Java学习笔记20 策略模式(Stratag…

本文详细介绍了策略模式的概念及其在软件开发中的应用。通过一个具体的排序示例,展示了如何使用策略模式来实现灵活的行为替换,增强软件的扩展性和可维护性。

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

1.什么是策略模式(Strategy)
    1)定义一组算法,将每个算法都封装起来,并且让它们之间可以互换
    2)策略模式使这些算法在客户端调用它们的时候能够互不影响地变化
2.策略模式的意义
    1)策略模式使开发人员能够开发出许多可替换的部分组成的软件,并且各部分之间是弱连接的关系
    2)弱连接的特性使软件具有更强的扩展性,易于维护:尤其是,它大大提高了软件的可重用性
3.策略模式的组成
    1)抽象策略角色:策略类,通常由一个接口或抽象类充当
    2)具体策略角色:包装了相关的算法和行为
    3)环境角色:持有一个策略类的引用,最终在客户端利用多态,通过引入具体策略角色实现功能
4.策略模式的实现
    1)策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。
    2)策略模式使得算法可以在不影响到客户端的情况下发生变化,使用策略模式可以把行为和环境分隔开来
    3)环境类负责维护和查询行为类,各种算法和环境独立开来,算法的修改都不会影响到环境和客户端
5.策略模式的编写步骤
    1)对策略对象定义一个公共接口
    2)编写策略类,该类实现了1)所定义的公共接口
    3)在使用策略对象的类中保存一个对策略对象的引用
    4)在使用策略对象的类中,实现对策略对象的set和get方法或者使用构造方法完成赋值

策略模式的具体应用:要求:假如有若干个类Person的对象存在List当中,对它们进行排序,按照名字进行排序(分正序和倒序两种排序方式),当姓名重复时,按照id的正序进行排序,(利用策略模式进行)
代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class Client
{
 
 public static void main(String[] args)
 {
  Person p1 = new Person("zhangsan", 20, 101);
  Person p2 = new Person("lisi", 20, 102);
  Person p3 = new Person("wangwu", 22, 103);
  Person p4 = new Person("zhangsan", 21,104);
  
  ArrayList<Person> list = new ArrayList<Person>();
  list.add(p1);
  list.add(p2);
  list.add(p3);
  list.add(p4);
  
  Environment roment = new Environment();
  //自然顺序排序
  UpSortOfName upSort = new UpSortOfName();
  roment.setSorter(upSort);
  roment.sort(list);
  for(Person i : list)
  {
    System.out.println(i.name + " " + i.age + " " + i.id);
  }
  System.out.println("****************");
  //倒序排序
  DownSortOfName downSort = new DownSortOfName();
  roment.setSorter(downSort);
  roment.sort(list);
  for(Person i : list)
  {
    System.out.println(i.name + " " + i.age + " " + i.id);
  }
 }
}

 class Person
{
  String name;
  int age;
  int id;
  public Person(String name, int age, int id)
  {
   this.name = name;
   this.age= age;
   this.id = id;
  }
}
 
interface Sorter
{
 public void sort(List<Person> list);
 
}

class UpSortOfName implements Sorter,Comparator<Person>
{
 public void sort(List<Person> list)
 {
  Collections.sort(list, this);
 }
 public int compare(Person p1,Person p2)
 {
  int value = p1.name.compareTo(p2.name);
  if(0 == value)
  {
   return p1.id - p2.id;
  }
  return value;
 }
}

class DownSortOfName implements Sorter,Comparator<Person>
{
 public void sort(List<Person> list)
 {
  Collections.sort(list, this);
 }
 public int compare(Person p1,Person p2)
 {
  int value = p2.name.compareTo(p1.name);
  if(0 == value)
  {
   return p1.id - p2.id;
  }
  return value;
 }
}

class Environment
{
 Sorter sorter;
 public Environment(Sorter sorter)
 {
  this.sorter = sorter;
 }
 public Environment()
 {
  
 }
 public void sort(List<Person> list)
 {
  this.sorter.sort(list);
 }
 public void setSorter(Sorter sorter) {
  this.sorter = sorter;
 }
}

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值