zoukankan      html  css  js  c++  java
  • 设计模式第三次作业

    设计模式第三次作业

    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);
    	}
    }
    
  • 相关阅读:
    「学习笔记」杂项算法学习笔记
    「CF484E」Sign on Fence「整体二分」「线段树」
    「BZOJ 2653」middle「主席树」「二分」
    「BZOJ 5010」「FJOI 2017」矩阵填数「状压DP」
    jmeter阶梯式加压测试
    jmeter监控内存,CPU等方法
    jmeter 读取多个用户名并同时发
    APP性能测试工具
    Android--iOS抓取崩溃日志
    安装并使用PICT,生成测试用例
  • 原文地址:https://www.cnblogs.com/xiezhe1204/p/7900140.html
Copyright © 2011-2022 走看看