设计模式第三次作业

设计模式第三次作业

GitHub地址:https://github.com/zlxzlxzlx/DP3

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

类图:

关键类java源码及注释:

public interface abstructIterator {
	    public void next();  
	    public boolean isLast();  
	    public void previous();  
	    public boolean isFirst();  
	    public String getNext();  
	    public String getPrevious();  

}

public interface abstructProduct {
   abstructIterator createIterator();
}

public class Product implements abstructProduct{
	private  Object[] obj={"苹果","梨","橙子","香蕉"};

	@Override
	public abstructIterator createIterator() {
		return new MyIterator();
	}
	private class MyIterator implements abstructIterator{
		 private int index1;  
		 private int index2; 
		 
		 public MyIterator() {  
		        index1 = 0;  
		        index2 = obj.length - 1;  
		    }  
		 
		@Override
		public void next() {
			  if(index1<obj.length){  
		            index1++;  
		        }  
			
		}

		@Override
		public boolean isLast() {
		 return (index1 == obj.length);
		}

		@Override
		public void previous() {
			 if (index2>-1) {  
		            index2--;  
		        }
		}

		@Override
		public boolean isFirst() {
			  return index2==-1;
		}

		@Override
		public String getNext() {
			return (String) obj[index1];
		}

		@Override
		public String getPrevious() {
			return  (String) obj[index2];
		}	
	}

	
}

public class client {

	public static void main(String[] args) {
	abstructIterator iterator;
	abstructProduct product =new Product();
	iterator=product.createIterator();
	while (!iterator.isLast()) {  
        System.out.print(iterator.getNext());  
        System.out.print(" "); 
        iterator.next();  
       }  
	System.out.println();
	 while (!iterator.isFirst()) {  
         System.out.print(iterator.getPrevious());  
         System.out.print(" "); 
         iterator.previous();  
     }  
	}

}

输出结果:

苹果 梨 橙子 香蕉 
香蕉 橙子 梨 苹果

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

类图:

关键类java源码及注释:

public interface abstructCommand {
	public void execute();
}

public class CreateCommand implements abstructCommand{

	private  BoardScreen bs;
       public CreateCommand( BoardScreen bs){
		this.bs=bs;
	}
	@Override
	public void execute() {
		bs.create();
	}
}

public class EditCommand implements abstructCommand{
	private  BoardScreen bs;
	public EditCommand ( BoardScreen bs){
		this.bs=bs;
	}
	@Override
	public void execute() {
		bs.edit();
	}
}

public class OpenCommand implements abstructCommand{

	private  BoardScreen bs;
	public OpenCommand ( BoardScreen bs){
		this.bs=bs;
	}
	@Override
	public void execute() {
		bs.open();
	}

}

public class MenuItem {
     private abstructCommand command;
     public MenuItem(abstructCommand command){
    	this.command=command; 
     }
     public void click(){
    	 this.command.execute();
     }
}

import java.util.ArrayList;

public class Menu {
	private ArrayList<MenuItem> menuItemsList = new ArrayList<MenuItem>();
	public void addMenuItem(MenuItem item){
		this.menuItemsList.add(item);
	}
	
	 public void clickMenuItem(int index) {
		 menuItemsList.get(index).click();
	    }
}

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 client {

	public static void main(String[] args) {
         Menu menu=new Menu();
         BoardScreen bs = new BoardScreen();
	 abstructCommand  oc=new OpenCommand(bs );
	 MenuItem item1=new MenuItem(oc);
	 menu.addMenuItem(item1);
	 abstructCommand  cc=new CreateCommand(bs );
         MenuItem item2=new MenuItem(cc);
	 menu.addMenuItem(item2);
 	 abstructCommand  ec=new EditCommand(bs );
         MenuItem item3=new MenuItem(ec);
	 menu.addMenuItem(item3);
      
	 menu.clickMenuItem(0);
	 menu.clickMenuItem(1);
	 menu.clickMenuItem(2);
	}
}

输出结果:

open被调用
create被调用
edit被调用

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

类图:

关键类java源码及注释:

public abstract class abstructChatRoom {
	public abstract  void addRoom(Member member);
  public abstract  void sendText(String form,String to,String text);
  public abstract void sendImage(String form,String to,String image);
}

import java.util.HashMap;
import java.util.Map;

public class ChatRoom extends abstructChatRoom{

	Map<String, Member> map=new HashMap<String,Member>();
	@Override
	public void addRoom(Member member) {
		map.put(member.getName(), member);
		member.setAbstructChatRoom(this);
	}
	
	@Override
	public void sendText(String from, String to, String text) {
          Member memberToText=map.get(to);
          memberToText.reciveText(from, text);
	}

	@Override
	public void sendImage(String from, String to, String image) {
		 Member memberToImage=map.get(to);
		 memberToImage.reciveImage(from, image);
	}
}

public abstract class Member {

	protected String name;
	protected abstructChatRoom abstructChatRoom;
   public Member(String name) {
		this.name=name;
	}
   public String getName() {
		return name;
	}
  
	public abstructChatRoom getAbstructChatRoom() {
		return abstructChatRoom;
	}
	public void setAbstructChatRoom(abstructChatRoom abstructChatRoom) {
		this.abstructChatRoom = abstructChatRoom;
	}
	public abstract void sendText(String to,String Text);
    public abstract void sendImage(String to,String Image);
    public void reciveText(String from,String Text){
       System.out.println(this.name+"接收来自"+from+"的文本:"+Text);
       }
    public void reciveImage(String from,String Image){
    	System.out.println(this.name+"接收来自"+from+"的图片:"+Image);
       }

}
public class DiamondMember extends Member{
	
	public DiamondMember(String name){
		super(name);
	}
	@Override
	public void sendText(String to, String Text) {
		System.out.println(this.name+"向"+to+"发送的文本:"+Text);
		super.abstructChatRoom.sendText(this.name, to, Text);
	}

	@Override
	public void sendImage(String to, String Image) {
		System.out.println(this.name+"向"+to+"发送的图片:"+Image);
		super.abstructChatRoom.sendImage(this.name, to, Image);
	}

}

public class CommonMember extends Member {
	
	public CommonMember(String name){
		super(name);
	}

	@Override
	public void sendText(String to, String Text) {
		System.out.println(this.name+"向"+to+"发送的文本:"+Text);
		super.abstructChatRoom.sendText(this.name, to, Text);
	}

	@Override
	public void sendImage(String to, String Image) {
	     System.out.println("对不起您没有发送图片的权限");
	}

}

public class client {

	public static void main(String[] args) {
		abstructChatRoom chatRoom=new ChatRoom();
		Member member1=new CommonMember("zlx");
		chatRoom.addRoom(member1);
		
		Member member2=new DiamondMember("lj");
		chatRoom.addRoom(member2);
		
		Member member3=new CommonMember("tf");
		chatRoom.addRoom(member3);
		
		member1.sendText("lj", "hello");
		member1.sendImage("ft", "image");
		
		member2.sendText("zlx", "fine");
		
		member3.sendText("zlx", "thank");
		member3.sendImage("lj", "image");
			

	}

}

输出结果:

zlx向lj发送的文本:hello
lj接收来自zlx的文本:hello
对不起您没有发送图片的权限
lj向zlx发送的文本:fine
zlx接收来自lj的文本:fine
tf向zlx发送的文本:thank
zlx接收来自tf的文本:thank
对不起您没有发送图片的权限

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

类图:

关键类java源码及注释:

public interface BookStrategy {
	 double calcPrice(double bookPrice); 
}

public class ComputerBook implements BookStrategy{


	@Override
	public double calcPrice(double bookPrice) {
		 System.out.println("ComputerBook 10% discount. "); 
			return bookPrice*0.9;
	}

}

public class LanguageBook implements BookStrategy{
	

	@Override
	public double calcPrice(double bookPrice) {
		 System.out.println("LanguageBook-2.0 discount."); 
		return bookPrice-2.0;
	}

}

public class NovelBook implements BookStrategy{

	@Override
	public double calcPrice(double bookPrice) {
		  System.out.println("NovelBook100.00-15.00");         
		  int bp = (int)bookPrice;          
		  return bookPrice - (double)(bp / 100 * 15);
	}

}

public class Price {
     private BookStrategy strategy;
     public void setStrategy(BookStrategy strategy){
    	 this.strategy=strategy;
     }
	public double calcPrice(double bookPrice){
    	 return this.strategy.calcPrice(bookPrice);
     }

}

public class client {

	public static void main(String[] args) {
		
		Price price1=new Price();
		BookStrategy strategy1=new ComputerBook();
		price1.setStrategy(strategy1);
		double p1=123;
		System.out.println("计算机类图书原价"+p1+"计算机类图书折扣后:"+price1.calcPrice(p1));
		
		Price price2=new Price();
		BookStrategy strategy2=new LanguageBook();
		price2.setStrategy(strategy2);
		double p2=456;
		System.out.println("语言类图书原价"+p2+"语言类图书折扣后:"+price2.calcPrice(p2));
		
		Price price3=new Price();
		BookStrategy strategy3=new NovelBook();
		price3.setStrategy(strategy3);
		double p3=789;
		System.out.println("小说类图书"+p3+"小说类图书折扣后:"+price3.calcPrice(p3));
		
	}

}

输出结果:

ComputerBook 10% discount. 
计算机类图书原价123.0计算机类图书折扣后:110.7
LanguageBook-2.0 discount.
语言类图书原价456.0语言类图书折扣后:454.0
NovelBook100.00-15.00
小说类图书789.0小说类图书折扣后:684.0

posted @ 2017-11-24 13:15  风火轮的菜园子  阅读(375)  评论(1编辑  收藏  举报