1、要求:某商品管理系统的商品名称存储在一个字符串数组中,现需要自定义一个双向迭代器(MyIterator)实现对该商品名称数组的双向(向前和向后)遍历。使用Iterator模式来设计。
类图

代码说明
// 商品
public interface Aggregate {
Iterator iterator();
void addAggregate(String aggregate);
Object getAllAggregates() ;
}
public class MyAggregate implements Aggregate {
private ArrayList arrayList = new ArrayList();
@Override
public Iterator iterator() {
return new MyIterator(this);
}
@Override
public void addAggregate(String aggregate) {
arrayList.add(aggregate);
}
@Override
public Object getAllAggregates() {
return arrayList;
}
}
// 迭代器
public interface Iterator {
// 下一个存在?
boolean hasNext();
// 下一个
Object next();
// 上一个存在?
boolean hasForward();
// 上一个
Object forward();
}
public class MyIterator implements Iterator{
private ArrayList arrayList = null;
private int index = 0;
public MyIterator(Aggregate aggregate ) {
this.arrayList = (ArrayList)aggregate.getAllAggregates();
}
@Override
public boolean hasNext() {
if (index<arrayList.size())return true;
else return false;
}
@Override
public Object next() {
if (hasNext()) return arrayList.get(index++);
else return null;
}
@Override
public boolean hasForward() {
if (index<=0) return false;
else return true;
}
@Override
public Object forward() {
if (hasForward()) return arrayList.get(--index);
else return null;
}
}
// 客户端
Aggregate aggregate = new MyAggregate();
aggregate.addAggregate("第1个商品");
aggregate.addAggregate("第2个商品");
aggregate.addAggregate("第3个商品");
aggregate.addAggregate("第4个商品");
aggregate.addAggregate("第5个商品");
Iterator iterator = aggregate.iterator();
// 向后迭代
while (iterator.hasNext()){
Object goods = iterator.next();
System.out.println(goods);
}
// 向前迭代
while (iterator.hasForward()){
Object goods = iterator.forward();
System.out.println(goods);
}
// 输出结果
第1个商品
第2个商品
第3个商品
第4个商品
第5个商品
第5个商品
第4个商品
第3个商品
第2个商品
第1个商品
2、要求:某公司欲开发一个基于Windows平台的公告板系统,系统提供主菜单(Menu)其中有菜单项(MenuItem)。通过Menu类的addMenuItem()方法增加菜单项。菜单项的打开方法是click(),每个菜单项包含一个抽象命令类,具体命令类包括OpenCommand()、CreateCommand()、EditCommand()等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen())的open()、create()、edit())等方法。使用Command模式来设计。
类图

代码说明
// 公告板系统界面
public class BoardScreen {
public void open(){}
public void create(){}
public void edit(){}
}
// 命令
public interface Command {
public void execute();
}
public class OpenCommand implements Command{
BoardScreen boardScreen;
public OpenCommand(BoardScreen boardScreen){
this.boardScreen = boardScreen;
}
@Override
public void execute() {
boardScreen.open();
}
}
public class CreateCommand implements Command{
BoardScreen boardScreen;
public CreateCommand(BoardScreen boardScreen){
this.boardScreen = boardScreen;
}
@Override
public void execute() {
boardScreen.create();
}
}
public class EditCommand implements Command{
BoardScreen boardScreen;
public EditCommand(BoardScreen boardScreen){
this.boardScreen = boardScreen;
}
@Override
public void execute() {
boardScreen.edit();
}
}
// 菜单
public class Menu {
HashMap menuItem = new HashMap<String,MenuItem>();
public void addMenuItem(String name,MenuItem menuItem){
this.menuItem.put(name,menuItem);
}
public MenuItem getMenuItem(String name){
return (MenuItem)menuItem.get(name);
}
}
// 菜单项
public class MenuItem {
Command command;
public void setCommand(Command command){
this.command = command;
}
public void click(){
command.execute();
}
}
// 使用情况
// 菜单
Menu menu = new Menu();
// 公告板系统界面
BoardScreen boardScreen = new BoardScreen();
// 命令
Command open = new OpenCommand(boardScreen);
Command create = new CreateCommand(boardScreen);
Command edit = new EditCommand(boardScreen);
// 菜单项
MenuItem menuItem1 = new MenuItem();
menuItem1.setCommand(open);
MenuItem menuItem2 = new MenuItem();
menuItem2.setCommand(create);
MenuItem menuItem3 = new MenuItem();
menuItem3.setCommand(edit);
// 为菜单添加菜单项
menu.addMenuItem("open",menuItem1);
menu.addMenuItem("create",menuItem2);
menu.addMenuItem("edit",menuItem3);
// open
menu.getMenuItem("open").click();
// create
menu.getMenuItem("create").click();
// edit
menu.getMenuItem("edit").click();
3、要求:某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)可以给其他会员发送文本和图片信息。该聊天室可以对不雅字符进行过滤,如“TMD”等字符,还可以对发送图片大小进行控制。使用Mediator模式来设计。
类图

代码说明
// 聊天室
public class ChatRoom {
// 用户列表
private ArrayList<Member> member = new ArrayList<>();
// 注册用户
public void registerMember(Member member){
this.member.add(member);
}
// 发送文字
public boolean sendText(String text){
if (filterText(text)) return false;
else {
// 发送文字
return true;
}
}
// 过滤文字
private boolean filterText(String text){
// 过滤状态
boolean filter = false;
// 过滤操作
// 文字不合法
if (filter)return true;
// 文字合法
else return false;
}
// 发送图片
public boolean sendImg(File img){
if (filterImg(img)) return false;
else {
// 发送图片
return true;
}
}
// 过滤图片
private boolean filterImg(File img){
// 过滤状态
boolean filter = false;
// 过滤操作
// 图片不合法
if (filter)return true;
// 图片合法
else return false;
}
}
// 会员接口
public interface Member {
void connect(ChatRoom chatRoom);
void sendText(String text);
void sendImg(File img);
}
// 普通会员
public class CommonMember implements Member {
ChatRoom chatRoom;
// 建立连接
@Override
public void connect(ChatRoom chatRoom){
this.chatRoom = chatRoom;
this.chatRoom.registerMember(this);
}
@Override
public void sendText(String text){
if (chatRoom.sendText(text)){
System.out.println("发送成功");
}else {
System.out.println("发送失败");
}
}
@Override
public void sendImg(File img) {
System.out.println("不能发送图片");
}
}
// 钻石会员
public class DiamondMember extends CommonMember {
@Override
public void sendImg(File img){
if (chatRoom.sendImg(img)){
System.out.println("发送成功");
}else {
System.out.println("发送失败");
}
}
}
// 客户端
// 建立聊天室
ChatRoom chatRoom = new ChatRoom();
// 普通会员
CommonMember commonMember = new CommonMember();
commonMember.connect(chatRoom);
commonMember.sendText("我是普通会员");
// 钻石会员
DiamondMember diamondMember = new DiamondMember();
diamondMember.connect(chatRoom);
diamondMember.sendText("我是钻石会员");
diamondMember.sendImg(new File("我是钻石会员要发送的图片"));
4、要求:设计一个网上书店,对系统中所有的计算机类图书(ComputerBook)每本都有10%的折扣,语言类图书(LanguageBook)每本都有2元的折扣,小说类图书(NovelBook)每100元有15元的折扣。使用Strategy模式来设计。
类图

代码说明
// 折扣接口
public interface Book {
double discount(double price);
}
// 计算机类折扣
public class ComputerBook implements Book {
@Override
public double discount(double price) {
return price * 0.9;
}
}
// 语言类图书折扣
public class LanguageBook implements Book {
@Override
public double discount(double price) {
return price - 2;
}
}
// 小说类图书折扣
public class NovelBook implements Book {
@Override
public double discount(double price) {
return price - Math.floor(price/100) * 15;
}
}
// 策略器
public class Price {
private Book book;
public Price(Book book){
this.book = book;
}
public double discount(double price){
return book.discount(price);
}
}
// 使用情况
// 三种图书
Book book1 = new ComputerBook();
Book book2 = new LanguageBook();
Book book3 = new NovelBook();
// 原价
double bookPrice = 300;
// 现价
double bookPriceNew;
// 计算机类图书
Price price1 = new Price(book1);
bookPriceNew = price1.discount(bookPrice);
System.out.println("计算机类图书原价"+bookPrice+",现价"+bookPriceNew);
// 语言类图书
Price price2 = new Price(book2);
bookPriceNew = price2.discount(bookPrice);
System.out.println("语言类图书原价"+bookPrice+",现价"+bookPriceNew);
// 小说类图书
Price price3 = new Price(book3);
bookPriceNew = price3.discount(bookPrice);
System.out.println("小说类图书原价"+bookPrice+",现价"+bookPriceNew);
// 运行结果
计算机类图书原价300.0,现价270.0
语言类图书原价300.0,现价298.0
小说类图书原价300.0,现价255.0