策略模式的概念
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。
个人对策略模式的一些理解
在策略类中对策略接口实现类的方法再封装,根据不同的需求使用不同的策略
举个栗子
小久的书架上有三本书,英语书,数学书,语文书,小久想读书有三种策略:读英语书,读数学书,读语文书,想读那本书就使用哪种策略
使用代码实现
1)准备书本接口类
package org.xiji.strategyTwo.book;
public interface Book {
String getBook();
}
2)书本接口实现类
1.语文书
package org.xiji.strategyTwo.book.Impl;
import org.xiji.strategyTwo.book.Book;
/**
* 语文书
*/
public class ChineseBook implements Book {
@Override
public String getBook() {
return "语文书";
}
}
2.英语书
package org.xiji.strategyTwo.book.Impl;
import org.xiji.strategyTwo.book.Book;
/**
* 英语书
*/
public class EnglishBook implements Book {
@Override
public String getBook() {
return "英语书";
}
}
3.数学书
package org.xiji.strategyTwo.book.Impl;
import org.xiji.strategyTwo.book.Book;
/**
* 数学书
*/
public class MathBook implements Book {
@Override
public String getBook() {
return "数学书";
}
}
3)读书策略
package org.xiji.strategyTwo.book;
/**
* 读书策略
*/
public class BookStrategy {
private Book book;
public BookStrategy(Book book)
{
this.book = book;
}
/**
* 获取书本
*
*/
public String getBookStrategy()
{
return book.getBook();
}
public BookStrategy() {
}
}
4)创建用户类
package org.xiji.strategyTwo.book;
/**
* 用户
*/
public class User {
private String name;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public void readBook(String book)
{
System.out.println(name + "正在读" + book);
}
}
5) StrategyTwoMain
package org.xiji.strategyTwo;
import org.xiji.strategyTwo.book.BookStrategy;
import org.xiji.strategyTwo.book.Impl.ChineseBook;
import org.xiji.strategyTwo.book.Impl.EnglishBook;
import org.xiji.strategyTwo.book.Impl.MathBook;
import org.xiji.strategyTwo.book.User;
/**
* 策略模式
*/
public class StrategyTwoMain {
public static void main(String[] args) {
User user = new User("小久");
//如何小久想读英语书,通过策略模式获取英语书
System.out.println("小久想读英语书");
String englishBook = new BookStrategy(new EnglishBook()).getBookStrategy();
user.readBook(englishBook);
System.out.println("小久想读数学书");
//如果小久想读数学书,通过策略模式获取数学书
String mathBook = new BookStrategy(new MathBook()).getBookStrategy();
user.readBook(mathBook);
//如果小久想读语文书,可以通过策略模式获取语文书
System.out.println("小久想读语文书");
String chineseBook = new BookStrategy(new ChineseBook()).getBookStrategy();
user.readBook(chineseBook);
}
}
6)运行结果
如何添加新的读书策略?
创建新的书本类,实现book接口,并且在读书策略类中获取,调用方法
添加历史书籍
1)创建历史书本类
package org.xiji.strategyTwo.book.Impl;
import org.xiji.strategyTwo.book.Book;
public class HistoryBook implements Book {
@Override
public String getBook() {
return "历史书";
}
}
2)修改StrategyTwoMain类
package org.xiji.strategyTwo;
import org.xiji.strategyTwo.book.BookStrategy;
import org.xiji.strategyTwo.book.Impl.ChineseBook;
import org.xiji.strategyTwo.book.Impl.EnglishBook;
import org.xiji.strategyTwo.book.Impl.HistoryBook;
import org.xiji.strategyTwo.book.Impl.MathBook;
import org.xiji.strategyTwo.book.User;
/**
* 策略模式
*/
public class StrategyTwoMain {
public static void main(String[] args) {
User user = new User("小久");
//如何小久想读英语书,通过策略模式获取英语书
System.out.println("小久想读英语书");
String englishBook = new BookStrategy(new EnglishBook()).getBookStrategy();
user.readBook(englishBook);
System.out.println("小久想读数学书");
//如果小久想读数学书,通过策略模式获取数学书
String mathBook = new BookStrategy(new MathBook()).getBookStrategy();
user.readBook(mathBook);
//如果小久想读语文书,可以通过策略模式获取语文书
System.out.println("小久想读语文书");
String chineseBook = new BookStrategy(new ChineseBook()).getBookStrategy();
user.readBook(chineseBook);
//获取小久想读历史书了
System.out.println("小久想读历史书");
String historyBook = new BookStrategy(new HistoryBook()).getBookStrategy();
user.readBook(historyBook);
}
}