设计模式NO.3

本次博客内容为第三次设计模式的练习。根据老师的要求完成下列题目:

题目1

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

类图设计如下:



代码实现如下:

a.Iterator接口


public interface Iterator {
public boolean hasNext();
public boolean hasFront();
public String next();
public String front();
public void setPositionOrder();
public void setPositionReverse(); }

b.具体Iterator类


public class MyIterator implements Iterator{ private Aggregate m_agg;
private int current;
private int size; public MyIterator(Aggregate m_agg)
{
current=0;
size = m_agg.getLength();
this.m_agg=m_agg;
}
@Override
public boolean hasNext() {
if(current<size)
return true; else
return false;
} @Override
public boolean hasFront() {
if(current>=0)
return true;
else
return false;
}
@Override
public String next() { return m_agg.getName(current++);
}
@Override
public String front() { return m_agg.getName(current--);
} @Override
public void setPositionOrder() {
current = 0; }
@Override
public void setPositionReverse() {
current = size-1; } }

c.Aggregate接口


public interface Aggregate {
public Iterator CreateIterator();
public int getLength();
public String getName(int position);
public void addName(String name); }

d.具体物品类


public class GoodList implements Aggregate{
private String names[];
private int num; public GoodList(int MaxNum)
{
num=0;
this.names = new String[MaxNum];
}
public int getLength()
{
return num;
}
public String getName(int position)
{
return names[position];
}
public void addName(String name)
{
names[num++]=name;
} @Override
public Iterator CreateIterator() {
return new MyIterator(this);
} }

e.测试代码


public class client {
public static void main(String[] args) {
Aggregate agg = new GoodList(100);
agg.addName("洗手液");
agg.addName("洗衣液");
agg.addName("牙膏");
agg.addName("洗发露");
Iterator it = agg.CreateIterator(); Orderview(it);
ReverseView(it);
}
private static void Orderview(Iterator it)
{
it.setPositionOrder();
while(it.hasNext())
System.out.println(it.next());
}
private static void ReverseView(Iterator it)
{
it.setPositionReverse();
while(it.hasFront())
System.out.println(it.front());
} }

题目2

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

类图设计如下:



代码实现如下:

a.抽象命令类


public abstract class Command {
protected BoardScreen bs; public Command(BoardScreen bs)
{
this.bs = bs;
}
public abstract void execute(); }

b.CreateCommand类


public class CreateCommand extends Command{ public CreateCommand(BoardScreen bs) {
super(bs); } @Override
public void execute() {
bs.create(); } }

c.OpenCommand类


public class OpenCommand extends Command{ public OpenCommand(BoardScreen bs) {
super(bs);
} @Override
public void execute() {
bs.open();
} }

d.EditCommand类

public class EditCommand extends Command{

	public EditCommand(BoardScreen bs) {
super(bs);
} @Override
public void execute() {
bs.edit(); } }

e.BoardScreen类


public class BoardScreen { public void open()
{
System.out.println("BoardScreen is opening!");
}
public void create()
{
System.out.println("BoardScreen is creating!");
} public void edit()
{
System.out.println("BoardScreen is editing!");
}
}

f.Menu类

public class Menu {

	private ArrayList<MenuItem> items = new ArrayList<MenuItem>();

	public void addItem(MenuItem item)
{
items.add(item);
} public void clickItem(int index)
{
items.get(index).click();
} }

g.MenuItem类


public class MenuItem {
private Command com; public MenuItem(Command com)
{
this.com=com;
}
public void click()
{
com.execute();
} }

h.测试类


public class client {
public static void main(String[] args) {
BoardScreen bs = new BoardScreen();
Menu menus = new Menu(); Command command = new CreateCommand(bs);
menus.addItem(new MenuItem(command)); command = new OpenCommand(bs);
menus.addItem(new MenuItem(command)); command = new EditCommand(bs);
menus.addItem(new MenuItem(command)); menus.clickItem(0);//BoardScreen is creating!
menus.clickItem(1);//BoardScreen is opening!
menus.clickItem(2);//BoardScreen is editing!
} }

题目3

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

类图设计如下:



代码设计如下:

a.抽象Member类


public abstract class Member {
protected ChatRoom cr;
protected String name; public Member(String name)
{
this.name = name;
} public abstract void setChatRoom(ChatRoom cr);
public abstract void sendPic(String pic);
public abstract void sendText(String text);
}

b.抽象聊天室类


public abstract class ChatRoom {
public abstract void sendPic(String pic);
public abstract void sendText(String text); }

c.CommonMember类


public class CommonMember extends Member{ public CommonMember(String name) {
super(name);
} @Override
public void setChatRoom(ChatRoom cr) {
this.cr=cr; } @Override
public void sendPic(String pic) {
System.out.println("only DiamonMember can send picture!" ); } @Override
public void sendText(String text) {
System.out.print("CommonMember ["+name+"] says: ");
cr.sendText(text); } }

d.DiamondMember类


public class DiamondMember extends Member{ public DiamondMember(String name) {
super(name);
} @Override
public void setChatRoom(ChatRoom cr) {
this.cr=cr; } @Override
public void sendPic(String pic) {
System.out.print("DiamondMember ["+name+"] send a picture: ");
cr.sendPic(pic); } @Override
public void sendText(String text) {
System.out.print("DiamondMember ["+name+"] says: ");
cr.sendText(text);
} }

e.RealChatRoom具体类


public class RealChatRoom extends ChatRoom{ @Override
public void sendPic(String pic) {
if(PicCheck(pic))
{
System.out.println(pic);
}
else
System.out.println("the size of picture is too large"); } @Override
public void sendText(String text) {
System.out.println(TextFilter(text)); } private boolean PicCheck(String Pic)
{
if(Pic.length()>9)
return false;
else
return true;
} private String TextFilter(String text)
{
return text.replaceAll("[Tt][Mm][Dd]", "***");
} }

f.测试类

public class client {
public static void main(String[] args) {
ChatRoom cr = new RealChatRoom(); Member m1 = new CommonMember("Jack");
Member m2 = new DiamondMember("Will"); m1.setChatRoom(cr);
m2.setChatRoom(cr); m1.sendText("tmd,NTMD,blablabla....");//CommonMember [Jack] says: ***,N***,blablabla....
m1.sendPic("gogogogogogogogog");//only DiamonMember can send picture! m2.sendText("tmd,NTMD,blablabla....");//DiamondMember [Will] says: ***,N***,blablabla....
m2.sendPic("good");//DiamondMember [Will] send a picture: good
m2.sendPic("goodgoodgoodgoodgoodgood");//DiamondMember [Will] send a picture: the size of picture is too large
} }

题目4

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

类图设计如下:



代码设计如下:

a.抽象Discount类


public abstract class Discount { public abstract double discount(double price);
}

b.ComputerDiscount类

public class ComputerDiscount extends Discount{

	@Override
public double discount(double price) {
return price*0.9;
} }

c.LanguageDiscount类


public class LanguageDiscount extends Discount{ @Override
public double discount(double price) {
return price-2;
} }

d.NovelDiscount类


public class NovelDiscount extends Discount{ @Override
public double discount(double price) {
return price-(price/100)*15;
}
}

e.Book类

public class Book {
private double price;
private Discount dis;
public Book(Discount dis)
{
this.dis=dis;
} public void setDiscount(Discount dis)
{
this.dis=dis;
}
public void setPrice(double price)
{
this.price = price;
}
public double getPrice()
{
return dis.discount(price);
}
}

f.测试类

public class client {
public static void main(String[] args) {
Book computer = new Book(new ComputerDiscount());
computer.setPrice(100.0); Book language = new Book(new LanguageDiscount());
language.setPrice(100.0); Book novel = new Book(new NovelDiscount());
novel.setPrice(100.0); System.out.println(computer.getPrice());//90.0
System.out.println(language.getPrice());//98.0
System.out.println(novel.getPrice());//85.0 } }

设计模式NO.3的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. 端口被占用:android studio 虚拟机adb.exe已停止工作的处理

    浏览:2190 | 更新:2017-09-16 05:00 1 2 3 4 5 6 分步阅读 在搭建android studio开发环境后,开始编程调试程序时,不管运行虚拟机还是真机,都不停出现&qu ...

  2. [ZOJ3435]Ideal Puzzle Bobble

    题面戳我 题意:你现在处于\((1,1,1)\),问可以看见多少个第一卦限的整点. 第一卦限:就是\((x,y,z)\)中\(x,y,z\)均为正 sol 首先L--,W--,H--,然后答案就变成了 ...

  3. 细说css中的position属性

    有过css开发经验的同学,对于position这个属性一定不会陌生,然而这个熟悉的属性确是面试题中的常客,也就说明了该属性在css的世界是有一定的江湖地位的,那么我们就来详细的说说position这个 ...

  4. NancyFX 第十二章 通道截拦

    所有的好的Web框架都有一套好的通道截拦的机制,Nancy在我看来是处理最好的.那什么是请求通道那?下面的图可能说的比较清楚些: 正如名称中描述的,一个典型的Web请求在到达最终响应前会穿过一定数量的 ...

  5. NancyFX 第四章 Nancy快速上手 (使用Nancy模板)

    在我们进一步深入学习Nancy之前,我们先快速的了解下Visual Studio下的Nancy模板. 采用Nancy模板,创建一个Nancy项目就像我们创建MVC应用或winForm应用一样简单,只需 ...

  6. SQL Server将自己的查询结果作为待查询数据子列之二

    嵌套子查询是SQL语句中比较常用的一种查询方法,开发过程中遇到查询需要将自己的某列作为待查询的数据,在参考别人的SQL语句的写法终于实现了自己需要的功能. 不太和谐查询语句如下: SELECT DIS ...

  7. c++函数常用

    isalnum 判断一个字符是否是字符类的数字或字母isalpha 判断一个字符是否是字母isblank 判断一个字符是否是空白字符(空格,水平制表符,TAB)iscntrl 判断一个控制符(ASCI ...

  8. serializeArray()获取的表单参数转化成json格式的对象

    目标:将serializeArray()这个方法获取的表单对象  转换成json格式 function serializeObject(){ //easyui提交表单 $('#form').form( ...

  9. python笔记之函数

    函数 >>> def funTest(param1): ... 'this is function document string.' #正文需要有缩进 ... return par ...

  10. IE浏览器清除缓存没用

    再想买更新JS和css文件之后, 使用 internet 里面的删除选项 发现样式和事件还是没用变 最终发现 需要 按 f12 找到这个清缓存才正常解决问题