初学者学Java设计模式(二)---------策略模式
策略模式(Strategy)
策略模式是指我们在遇到不同的问题时,采用不同的策略来解决问题。专业点说,就是定义一组算法,将每个算法都封装起来,并且他们之间可以互相转换。使客户可以在遇到不同问题的时候,方便的调用不同的算法而不影响其他的。这样可以大大的提高代码的可重用行。
策略模式的组成:
1.抽象策略角色:策略类,通常由一个接口或一个抽象类来实现。
2.具体策略角色:包装了相关的算法和行为。
3.环境角色:持有一个策略类的引用,最终给客户端调用。
策略模式的实现思想是将一个个的算法都封装到接口的一个个的实现类中,利用多态来完成环境角色的调用。这样每个实现类之间就不会互相的影响了。
下面我以图书馆书的排放来给大家具体讲解一下。
首先我们需要创建一个类Book,用来表示图书:
public class Book {
private String bookName;
private int id;
public Book(String bookName,int id)
{
this.bookName = bookName;
this.id = id;
}
//省略setter和getter
}
这时我们有两种方法对书进行排序,一种是按照书名的顺序,一种是按照编号的顺序,具体使用哪种现在是不确定的,这时我们就需要使用策略模式来解决这个问题。
首先我们需要来写我们的抽象策略角色:
public interface BookStrategy {
public int compare(Objecto1,Objecto2);
}
这个接口中只有一个方法,是用来进行比较,比较什么还未定。
下面我们来编写具体策略角色:
1.第一个按书名的顺序排序:
public class BookNameStrategy implements BookStrategy {
public int compare(Object o1, Object o2) {
Book book1 = (Book)o1;
Book book2 = (Book)o2;
return (book1.getBookName().compareTo(book2.getBookName()));
}
}
2.还有一种是按编号顺序排序:
public class BookIdStrategy implements BookStrategy{
public int compare(Object o1, Object o2) {
Book book1 = (Book)o1;
Book book2 = (Book)o2;
return book1.getId()-book2.getId();
}
}
最后写的就是我们的环境角色了:
public class BookSort {
BookStrategy strategy;
public BookSort(BookStrategy strategy)
{
this.strategy = strategy;
}
public void setStrategy(BookStrategy strategy)
{
this.strategy = strategy;
}
public ArrayListbook = newArrayList();
public void addBook(Book book)
{
Iterator iter = this.book.iterator();
if(this.book.isEmpty())
{
this.book.add(0, book);
}
else
{
int i;
for(i = 0;iter.hasNext();i++)
{
if(strategy.compare(book, iter.next())>0)
{
break;
}
}
this.book.add(i, book);
}
}
}
环境角色中的构造方法是用来接收“策略”的,用户想要按那种方式排序就按照那种排序。
下面我们来编写测试类:
public class BookTest {
public static void main(String[]args) {
BookStrategy BS = new BookIdStrategy();
BookSort bookSort = new BookSort(BS);
Book book1 = new Book("sanguoyanyi",1);
Book book2 = new Book("shuihuzhuan",2);
Book book3 = new Book("xiyouji",3);
Book book4 = new Book("zhouyi",4);
bookSort.addBook(book1);
bookSort.addBook(book2);
bookSort.addBook(book3);
bookSort.addBook(book4);
Iterator iter = bookSort.book.iterator();
System.out.println(bookSort.book.size());
while(iter.hasNext())
{
System.out.println(((Book)iter.next()).getBookName());
}
}
}
当我们想要改变书的排序方式时,我们只需调用setStrategy()方法就可以,这大大的提升了代码的可重写行。,在实际应用中策略模式会把接口给大家,大家可以根据自己的需要来实现想要的结果。
以上就是策略模式。