
正文
策略模式java源代码 java策略模式优化ifelse
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java源码中应用哪些设计模式
3种工厂模式 单例模式 策略模式 用的都很多 其实实际开发中用的最多的还是工厂和单例,其余的根本没用过。
相关问答
Q1: Java中,状态模式和策略模式的区别
策略模式通过封装一组相关算法,为Client提供运行时的灵活性。Client可以在运行时,选择任一算法,而不改变使用算法的Context。一些流行的策略模式的例子是写那些使用算法的代码,例如加密算法、压缩算法、排序算法。另一方面,状态模式允许对象,在不同的状态拥有不同的行为。因为现实世界中的对象通常都是有状态的,所以在不同状态,行为也不一样。例如,VM(自动售货机)只在hasCoin状态才给吐商品;不投币,是不会吐的。现在可以清楚的看出不同之处了:意图是不同的。状态模式帮助对象管理状态,而策略模式允许Client选择不同的行为。
另一个不那么容易能看出来的区别是:是谁促使了行为的改变。策略模式中,是Client提供了不同的策略给Context;状态模式中,状态转移由Context或State管理。另外,如果在State中管理状态转移,那么必须持有Context的引用。例如,在VM的例子中,State对象需要调用VM的setState()方法去改变的状态。另一方面,Strategy从不持有Context的引用,是Client把所选择的Strategy传递给Context。由于状态模式和策略模式的区别,是流行的Java设计原则类面试题之一,将会在本文探讨在Java中,状态模式和策略模式的异同,这可以加深理解。
(1)相似之处
看看状态模式和策略模式的UML图,就会发现结构非常相似。使用State对象改变自己行为的对象被称为Context对象;相似的,使用Strategy对象改变自己行为的对象叫Context对象。记住,Client和Context打交道。在状态模式中,Context把方法调用委托给当前的状态对象,而在策略模式中,Context使用的Strategy对象,是被当做参数传递过来的,或在Context对象被创建时就被提供的。
这是专为经典的VM问题而设计的状态模式UML类图。可以看出,VM的状态是个接口,表示不同状态的具体实现。每一个状态都持有Context的引用,用来管理由Context触发的行为导致的状态转移。
这是专为实现排序功能而设计的策略模式UML类图。因为存在很多排序算法,该模式让Client在排序时选择适当的算法。事实上,Java的集合框架就使用这个模式,实现了用来排序的Collections.sort()方法。不同的是,不允许Client选择排序算法,而是让传递Comparator或Comparable接口的实例来指定比较策略。
(2)不同之处
策略模式封装了一组相关算法,允许Client在运行时使用可互换的行为;状态模式帮助一个类在不同的状态显示不同的行为。
状态模式封装了对象的状态,而策略模式封装算法或策略。因为状态是跟对象密切相关的,不能被重用;而通过从Context中分离出策略或算法,可以重用。
在状态模式中,每个状态通过持有Context的引用,来实现状态转移;但是每个策略都不持有Context的引用,只是被Context使用。
策略实现可以作为参数传递给使用的对象,例如Collections.sort(),参数包含一个Comparator策略。另一方面,状态是Context对象自己的一部分,随着时间的推移,Context对象从一个状态转移到另一个状态。
虽然都符合OCP原则,策略模式也符合SRP原则(单一职责原则),因为每个策略都封装自己的算法,且不依赖其他策略。一个策略的改变,并不会导致其他策略的变化。
另一个理论上的不同:策略模式定义了对象“怎么做”的部分。例如,排序对象怎么对数据排序。状态模式定义了对象“是什么”和“什么时候做”的部分。例如,对象处于什么状态,什么时候处在某个特定的状态。
状态模式中很好的定义了状态转移的次序;而策略模式并无此需要:Client可以自由的选择任何策略。
一些常见的策略模式的例子是封装算法,例如排序算法,加密算法或者压缩算法。如果看到代码需要使用不同类型的相关算法,那么考虑使用策略模式吧。而识别何时使用状态模式是很简单的:如果需要管理状态和状态转移,但不想使用大量嵌套的条件语句,那么就是了。
最后但最重要的一个不同之处是,策略的改变由Client完成;而状态的改变,由Context或状态自己。
Q2: java策略模式与接口直接实现
策略模式java源代码我是一个java初学者策略模式java源代码,我下面写策略模式java源代码的东西都是我个人的猜想,楼主可以作为参考,但不要相信。--------感觉由context包装以后的耦合性更低一些,传入不同的new AddStrategy(),context.calculate(10, 5)会实现不同的功能,通过这样的方式,如果通过配置文件的方式来实现对算法的配置,直接利用接口就把代码写死策略模式java源代码了,而策略模式由于具有低耦合性就可以通过配置对象来配置不同的算法。。
Q3: JAVA设计模式
嗯策略模式java源代码,是策略模式策略模式java源代码,代码如下。策略模式java源代码你把里面你要策略模式java源代码的奖金计算好就可以用了。建议楼主去看下《大话设计模式》或者《java设计模式》里面讲策略模式java源代码的挺生动的。
//奖金接口
public interface Bonus {
Double calcBonus();
}
//累计奖金
public class AccumulativeBouns implements Bonus{
public Double calcBonus() {
//总的汇款额*0.1%
return 0.0;
}
}
//业务奖金
public class BusinessBonus implements Bonus{
public Double calcBonus(){
//每个人当月业务奖金=当月销售额*3%
return 0.0;
}
}
//团队奖金
public class TeamBonus implements Bonus{
public Double calcBonus(){
//团队总销售额*1%
return 0.0;
}
}
public class BounsContext {
private Bonus bonus;
public BounsContext(Bonus bonus){
this.bonus=bonus;
}
public double calcBonus(){
return bonus.calcBonus();
}
}
调用..
public class MainTest {
public static void main(String [] args){
//累计奖金
BounsContext bounsContext=null;
bounsContext =new BounsContext(new AccumulativeBouns());
bounsContext.calcBonus();
//团队奖金
bounsContext=new BounsContext(new TeamBonus());
bounsContext.calcBonus();
//业务奖金
bounsContext=new BounsContext(new BusinessBonus());
bounsContext.calcBonus();
}
}
Q4: 求一份可以提供很多学生学号排序的Java代码
小众策略模式java源代码的treeset + 策略模式 帮你实现一个.
import java.util.TreeSet;
public class Test {
/**
* 测试,TreeSet 1去重 2比较器排序 3比较器中小众策略模式java源代码的扩展三目表达式应用
*
* @param args
*/
public static void main(String[] args) {
TreeSetStudent set = new TreeSetStudent(new CompareUtils());
set.add(new Student(1, "remind"));
set.add(new Student(3, "lucy"));
set.add(new Student(2, "lird"));
set.add(new Student(3, "houty"));
set.add(new Student(4, "tina"));
set.add(new Student(7, "houty"));
for (Student stu : set) {
System.out.println(stu);
}
}
}
/**
* pojo类
*
* @author remind
*
*/
public class Student {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
import java.util.Comparator;
/**
* 比较器
*
* @author remind
*
*/
public class CompareUtils implements ComparatorStudent {
@Override
public int compare(Student o1, Student o2) {
return (o1.getId() o2.getId()) ? 1 : (o1.getId() == o2.getId()) ? 0 : -1;
}
}
Q5: 设计模式 - 策略模式
简单的来个例子
我们现在有一个事件 , ChatEvent , 但是事件类型有很多 , 比如连接服务器事件, 接收信息时间, 异常事件, 断开服务器事件 , 还有很多事件, 但是我们如果采用if语句进行判断, 确实很难维护,代码感官不好
下面演示常见模拟
ChatEvent 事件
ChatEventListener 事件监听器
ChatEventHandler 事件处理器
我们发现一堆 ifelse , 或者 switch..case 语句时让别人看源码发现 , 这个水平也太垃圾了吧 , 就这么写 , 哎 , 所以此时我们就引入了我们的
ChatEventHandler 接口类 , 我们将他实现成各种事件的Handler , 比如 ClientReadChatEventHandler , ClientShutDownChatEventHandler 等等之类的 .
此时我们只需要维护我们这些拓展的 ChatEventHandler 的实现类 , 那么我们该怎么维护呢, 此时我们选择Java提供的 HashMap , 此时我们只需要一个这个就行了
此时我们的代码就会变成
此时我们只需要拓展我们的handler , 就可以实现, 各种情况, 这种对于整体的拓展性也提高了, 同时代码的耦合度也大大降低 ,我们只需要维护我们的 EventType , Map , EventHandler 三者关系 , 中间只有Map进行桥接 , 这就是桥接模式, 同时我们的拓展点只是我们的各种Handler 就行了 .
策略模式java源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java策略模式优化ifelse、策略模式java源代码的信息别忘了在本站进行查找喔。








