设计模式NO.3
设计模式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的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- java 设计模式
目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- C#图解教程 第十一章 枚举
枚举 枚举 设置底层类型和显式值隐式成员编号 位标志 Flags特性使用位标志的示例 关于枚举的补充 枚举 枚举 枚举是由程序员定义的类型与类或结构一样. 与结构一样,枚举是值类型,因此直接存储它们的 ...
- Python编程核心内容之二——切片、迭代和列表生成式
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 最近太忙啦.很多事情需要自己处理,感觉时间不够用啊~~~~今后,博客更新时间可能会慢下来,哈哈,正所谓"人 ...
- struct 2 基本知识
(最近在写一个ssh的项目,虽然看网上好像都说ssh已经过气了...之前虽然老师有上过这个课,我还做了一个PPT专门讲这个来着,但果然没有实践经验还是不容易理解.在参照一个项目写ssh时候,表示四脸蒙 ...
- JBox使用详解
插件说明 - jBox 是一款基于 jQuery 的多功能对话框插件,能够实现网站的整体风格效果,给用户一个新的视觉享受. 运行环境 - 兼容 IE6+.Firefox.Chrome.Safari.O ...
- webrtc起步 - apprtc服务器搭建
简介 apprtc 是什么,webrtc.org官方指定体验app 原料: ubuntu14.04,其他linux版本不限,官方并没特殊说明 chrome M51+ stunnle ...
- 部署wcf出现的问题与解决方法
我将本机作为服务器开发时,没出什么问题,将wcf服务端寄缩到另一台电脑上时,出现了一些问题,这里总结下: 1.wcf服务器和另一个网站应用出问题 服务器的iis上有一个网站应用,当我将wcf服务寄缩到 ...
- nodejs中的require,exports使用说明
模块是一门语言编写大项目的基石,因此,了解如何组织.编写.编译.加载模块很重要.这里主要谈谈Node中的模块加载. 1.Node中的模块,主要使用require来加载模块,文件 require(&qu ...
- python解决图的最短路径问题
在hihoCoder上遇到一个算法题目,描述如下: 对图结构有了解的不难发现,这是经典的求图的最短路径问题.以下是python代码: def findMin(row): minL = max(row) ...
- 使用jquery-panzoom来实现图片或元素的放大缩小
1. html <div class="wrapper"> <a class="btn btn-md" ui-turn-off="A ...
- vue中$on与$emit的实际应用
$on常用于监听自定义事件,触发后可传入参数 //监听event1事件 vm.$on('event1',function(msg){ console.log(msg) }) //触发event1自定义 ...