简单的if(){} else if(){} 还好,就怕if {}else if()的里面给你整个俄罗斯套娃。画面太美:
// 判断书本状态
private void testIf(String status){
if("prepare".equals(status)){
if("..".equals(status)){
System.out.println("..");
}
}else if("done".equals(status)){
System.out.println("done");
}else if("read".equals(status)){
System.out.println("read");
}
}
等到上面的场景编程 20多个状态时候,有没有火葬场的感觉,修改一次岂不是会被坑死。
有人就说了,引入switch啊 其实么有什么差别还是太多行。
那引入卫模式呢 位模式个人感觉是减少了else 语句,代码看起来更简洁一点:
上面代码的卫模式:
private void testWei(String stauts){
if("prepare".equals(stauts)){
System.out.println("prepare");
return;
}
if("done".equals(stauts)){
System.out.println("done");
return;
}
if("read".equals(stauts)){
System.out.println("read");
return;
}
}
也是可以,但这种过多的修改也不方便。
使用枚举 + 接口:
像这种状态类的都可以封装成enum类型 并抽象接口 进行操作 ,就是啥干啥,相互对应
1、定义公共接口
public interface BookOperation {
// 操作
void op();
}
2、定义枚举 实现 该接口
public enum BookEnum implements BookOperation{
// 待读状态
PREPARE{
@Override
public void op() {
System.out.println("prepare");
}
},
// 读完
DONE{
@Override
public void op() {
System.out.println("done");
}
},
// 在读
READ{
@Override
public void op() {
System.out.println("read");
}
}
}
3、使用
使用时候就直接传入 该枚举对象就行了
private void testEnum(BookEnun bookEumn){
bookEumn.op(); // op进行相应操作
}
而且这种在新增新的book操作状态时,只需要在BookEnum中增加新的枚举即可。
除了枚举还有 工厂模式和策略模式
工程模式
定义角色 :
class PrepareOp implements BookOperation{
@Override
public void op() {
System.out.println("prepare");
}
}
class ReadOp implements BookOperation{
@Override
public void op() {
System.out.println("read");
}
}
class DoneOp implements BookOperation{
@Override
public void op() {
System.out.println("done");
}
}
定义工厂 BookFactory:
public class BookFactory {
static Map<String,BookOperation> map = new HashMap<>();
// map初始化
static {
map.put("prepare",new PrepareOp());
map.put("done",new DoneOp());
map.put("read",new ReadOp());
}
public static BookOperation getBookOp(String bookStatus){
return map.get(bookStatus);
}
}
使用
//工厂模式
private void testFactory(String stauts){
BookFactory.getBookOp(stauts);
}
以后更改也同样方便。
策略模式
定义context:
public class BookContext {
private BookOperation bookOperation;
public BookContext(BookOperation operation){
this.bookOperation = operation;
}
// 执行方法
public void dos(){
this.bookOperation.op();
}
}
直接使用
//策略模式
private void testContext(){
PrepareOp op = new PrepareOp();
BookContext context = new BookContext(op);
context.dos();
}