设计模式第三次作业

Posted 解哲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式第三次作业相关的知识,希望对你有一定的参考价值。

设计模式第三次作业

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

抽象迭代器

public interface AbstractIterator {
	public String next();
	public String last();
	public int hasNext();//拥有查看是否到边界的功能,包括头和尾
	public String currentIterator();
}

抽象容器

public interface AbstractStringArray{
	public abstract AbstractIterator createIterator();
}

商品容器

public class StringArray implements AbstractStringArray{
	private String[] goods= {
			"milk","cookie","wine","noodles","rice"
	};
	public int getLength() {
		return goods.length;
	}
	public String getItem(int positon) {
		return goods[position];
	}
	public AbstractIterator createIterator() {
		return new MyIterator();
	}
}

双向迭代器

public class MyIterator implements AbstractIterator{
	public MyIterator(StringArray stringArray) {
		this.stringArray=stringArray;
	}
	private StringArray stringArray;
	private int index=0;
	public int hasNext{
		if(index>=stringArray.getLength()&&index<=0) {
			return 0;
		}
		else return 1;
	}
	public String next() {
		if(hasNext==0) {
			return stringArray.getItem(index);
			index++;
		}
	}
	public String last() {
		if(hasNext==0) {
			return stringArray.getItem(index);
			index--;
		}
	}
	public String currentItem() {
		return stringArray.getItem(index);
	}
}

客户类

public class Client{
	StringArray stringArray;
	AbstractIterator iterator=stringArray.createIterator();
	
	public void nextRead() {
		for(int i=0;i<iterator.hasNext();i++) {
			
			System.out.println(iterator.currentIterator());
			iterator.next();
		}
	}
	public void lastRead() {
		for(int i=stringArray.getLength();i<iterator.hasNext();i--) {
			
			System.out.println(iterator.currentIterator());
			iterator.last();
		}
		
	}
}

2.某公司欲开发一个基于Windows平台的公告板系统,系统提供主菜单(Menu)其中有菜单项(MenuItem)。通过Menu类的addMenuItem()方法增加菜单项。菜单项的打开方法是click(),每个菜单项包含一个抽象命令类,具体命令类包括OpenCommand()、CreateCommand()、EditCommand()等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen())的open()、create()、edit())等方法。使用Command模式来设计。

抽象命令类

public abstract class Command {
	public void execute() {};
}

接收者boardscreen类

public class BoardScreen{
	public void open() {
		System.out.println("open");
	}
	public void create() {
		System.out.println("create");
	}
	public void edit() {
		System.out.println("edit");
	}
}

具体命令类

public class OpenCommand extends Command{
	private BoardScreen boardScreen=null;
	public OpenCommand(BoardScreen boardScreen) {
		this.boardScreen=boardScreen;
	}
	public void execute() {
		boardScreen.open();
	}
}

public class CreateCommand extends Command{
	private BoardScreen boardScreen=null;
	public CreateCommand(BoardScreen boardScreen) {
		this.boardScreen=boardScreen;
	}
	public void execute() {
		boardScreen.create();
	}
}

public class EditCommand extends Command{
	private BoardScreen boardScreen=null;
	public EditCommand(BoardScreen boardScreen) {
		this.boardScreen=boardScreen;
	}
	public void execute() {
		boardScreen.edit();
	}
}

请求者类

public class MenuItem{
	private Command openCommand=null;
	private Command createCommand=null;
	private Command editCommand=null;
	MenuItem(Command openCommand,Command createCommmand,Command editCommand){
		this.openCommand=openCommand;
		this.createCommand=createCommmand;
		this.editCommand=editCommand;
	}
	public void openC(){
		openCommand.execute();

	}
	public void createC(){
		createCommand.execute();

	}
	public void editC(){
		editCommand.execute();

	}
}

菜单类

public class Menu{
	private List<MenuItem> menuList=new ArrayList<>();
	public void addMenuItem(MenuItem MenuItem) {
		menuList.add(MenuItem);
	}
	public MenuItem getMenuItem(int index) {
		return menuList.get(index);
	}
}

客户类(测试类)

public class Client{
	public static void main() {
		//接受者
		BoardScreen boardScreen=new BoardScreen();
		Menu menu=new Menu();
		//命令对象
		OpenCommand open=new OpenCommand(boardScreen);
		CreateCommand create=new CreateCommand(boardScreen);
		EditCommand edit=new EditCommand(boardScreen);
		//请求者
		MenuItem menuItem=new MenuItem(open,create,edit);
		menu.addMenuItem(menuItem);
		//测试
		menuItem.createC();
		menuItem.editC();
		menuItem.openC();
		
	}
}

3.某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)可以给其他会员发送文本和图片信息。该聊天室可以对不雅字符进行过滤,如“TMD”等字符,还可以对发送图片大小进行控制。使用Mediator模式来设计。

抽象聊天室

public abstract class AbstractLobby {
	public abstract void sendImage();
	public abstract void sendLetter();
}

抽象成员

public class Member{
	private AbstractLobby abstractLobby;
	private String name;
	public String getName() {
		return name;
	}
	Member(AbstractLobby abstractLobby,String name){
		this.abstractLobby=abstractLobby;
		this.name=name;
	}
}

钻石会员

public class DiamondMember extends Member{
	DiamondMember(AbstractLobby abstractLobby,String name){
		super(abstractLobby,name);
	}
	public void sendImage(String image) {
		System.out.println("DiamondMember "+this.getName()+" send image "+image);
	}
	public void sendLetter(String letter) {
		System.out.println("DiamondMember"+this.getName()+" send message "+letter);
	}
}

普通会员

public class CommonMember extends Member{
	CommonMember(AbstractLobby abstractLobby,String name){
		super(abstractLobby,name);
	}
	public void sendLetter(String letter) {
		System.out.println("CommonMember"+this.getName()+" send message "+letter);
	}
}

聊天室

public class Lobby extends AbstractLobby{
	DiamondMember dm;
	CommonMember cm;
	
	
	private int size=5;
	public void setSize(int size) {
		this.size=size;
	}
	//判断规范
	public String checkLetter(String letter) {
		 letter.replace("TMD","!@#");
		 letter.replace("fuck", "!@#");
		return	letter;
	}
        //判断大小
	public boolean checkImage(String image) {
		if(image.length()>size)
			return false;
		else return true;
	}
	
	public void setDM(DiamondMember dm) {
		this.dm=dm;
	}
	public void setCM(CommonMember cm) {
		this.cm=cm;
	}
	//判断图片是否符合限制并发送
	public void sendImage(String image) {
		if(checkImage(image))
			dm.sendImage(image);
		else
			System.out.println("send failed,Too large to send");
	}
        //判断是否出现敏感词并发送
	public void sendLetter(String letter,Member member) {
		if(member==dm) {
			dm.sendLetter(checkLetter(letter));
		}
		else
			cm.sendLetter(checkLetter(letter));
	}
}

客户类

public class Client{
	public static void main(String[] args) {
		Lobby lobby=new Lobby();
		
		DiamondMember diamondMember=new DiamondMember(lobby,"ash");
		CommonMember commonMember=new CommonMember(lobby,"jackle");
		//添加入聊天室
		lobby.setDM(diamondMember);
		lobby.setCM(commonMember);
		xn--wcs23c1yd9t9a76olnr
		lobby.setSize(10);
		//测试
		diamondMember.sendImage("imageSize");
		diamondMember.sendLetter("what the fuck!!!");
		commonMember.sendLetter("what the hell!!!");
	}
}

4.设计一个网上书店,对系统中所有的计算机类图书(ComputerBook)每本都有10%的折扣,语言类图书(LanguageBook)每本都有2元的折扣,小说类图书(NovelBook)每100元有15元的折扣。使用Strategy模式来设计。

折扣策略类

public interface OffStrategy {
	public double paymentCal(double bookPrice);
}

计算机折扣类

public class ComputerBook implements OffStrategy{
	
	public double paymentCal(double bookPrice) {
		return bookPrice*0.9;
	}
	
}

语言书折扣类

public class LanguageBook implements OffStrategy{
	
	public double paymentCal(double bookPrice) {
		return bookPrice-2.0;
	}
	
}

小说折扣类

public class NovelBook implements OffStrategy{
	
	public double paymentCal(double bookPrice) {
		return bookPrice-15*((int)bookPrice/100);
	}
	
}

价格类(context)

public class Price{
	private OffStrategy offStrategy;
	
	public Price(OffStrategy offStrategy) {
		this.offStrategy=offStrategy;
	}
	public void setBookType(OffStrategy offStrategy) {
		this.offStrategy=offStrategy;
	}
	
	public double bill(double bookPrice) {
		return this.offStrategy.paymentCal(bookPrice);
	}
}

客户类(测试类)

public class Client{
	public static void main(String[] args) {
		OffStrategy computer=new ComputerBook();
		OffStrategy language=new LanguageBook();
		OffStrategy novel=new NovelBook();
		double bookBill=0;
		
		Price price=new Price(computer);
		double bookPrice=price.bill(240);
		bookBill=bookPrice+bookBill;
		System.out.println("bookprice is "+bookPrice);
		
		price.setBookType(language);
		bookPrice=price.bill(400);
		bookBill=bookPrice+bookBill;
		System.out.println("bookprice is "+bookPrice);
		
		price.setBookType(novel);
		bookPrice=price.bill(310);
		bookBill=bookPrice+bookBill;
		
		System.out.println("bookprice is "+bookPrice);
		System.out.println("total price is "+bookBill);
	}
}

以上是关于设计模式第三次作业的主要内容,如果未能解决你的问题,请参考以下文章

第三次作业-栈和队列

第三次作业

第三次作业

第三次作业

第三次作业

第三次作业