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

类图

设计模式3

代码说明

//  商品
public interface Aggregate {
    Iterator iterator();
    void addAggregate(String aggregate);
    Object getAllAggregates() ;
}
public class MyAggregate implements Aggregate {
    private ArrayList arrayList = new ArrayList();
    @Override
    public Iterator iterator() {
        return new MyIterator(this);
    }

    @Override
    public void addAggregate(String aggregate) {
        arrayList.add(aggregate);
    }

    @Override
    public Object getAllAggregates() {
        return arrayList;
    }
}
//  迭代器
public interface Iterator {
    //  下一个存在?
    boolean hasNext();
    //  下一个
    Object next();
    //  上一个存在?
    boolean hasForward();
    //  上一个
    Object forward();
}

public class MyIterator implements Iterator{
    private ArrayList arrayList = null;
    private int index = 0;
    public MyIterator(Aggregate  aggregate ) {
        this.arrayList = (ArrayList)aggregate.getAllAggregates();
    }

    @Override
    public boolean hasNext() {
        if (index<arrayList.size())return true;
        else return false;
    }

    @Override
    public Object next() {
        if (hasNext()) return arrayList.get(index++);
        else return null;
    }

    @Override
    public boolean hasForward() {
        if (index<=0) return false;
        else return true;
    }

    @Override
    public Object forward() {
        if (hasForward()) return arrayList.get(--index);
        else return null;
    }
}
        //  客户端
        Aggregate aggregate = new MyAggregate();
        aggregate.addAggregate("第1个商品");
        aggregate.addAggregate("第2个商品");
        aggregate.addAggregate("第3个商品");
        aggregate.addAggregate("第4个商品");
        aggregate.addAggregate("第5个商品");

        Iterator iterator = aggregate.iterator();
        //  向后迭代
        while (iterator.hasNext()){
            Object goods = iterator.next();
            System.out.println(goods);
        }
        //  向前迭代
        while (iterator.hasForward()){
            Object goods = iterator.forward();
            System.out.println(goods);
        }
//	输出结果
第1个商品
第2个商品
第3个商品
第4个商品
第5个商品
第5个商品
第4个商品
第3个商品
第2个商品
第1个商品

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

类图

设计模式3

代码说明

//  公告板系统界面
public class BoardScreen {
    public void open(){}
    public void create(){}
    public void edit(){}
}
//  命令
public interface Command {
    public void execute();
}

public class OpenCommand implements Command{
    BoardScreen boardScreen;
    public OpenCommand(BoardScreen boardScreen){
        this.boardScreen = boardScreen;
    }
    @Override
    public void execute() {
        boardScreen.open();
    }
}

public class CreateCommand implements Command{
    BoardScreen boardScreen;
    public CreateCommand(BoardScreen boardScreen){
        this.boardScreen = boardScreen;
    }
    @Override
    public void execute() {
        boardScreen.create();
    }
}

public class EditCommand implements Command{
    BoardScreen boardScreen;
    public EditCommand(BoardScreen boardScreen){
        this.boardScreen = boardScreen;
    }
    @Override
    public void execute() {
        boardScreen.edit();
    }
}
//  菜单
public class Menu {
    HashMap menuItem = new HashMap<String,MenuItem>();
    public void addMenuItem(String name,MenuItem menuItem){
        this.menuItem.put(name,menuItem);
    }

    public MenuItem getMenuItem(String name){
        return (MenuItem)menuItem.get(name);
    }
}
//  菜单项
public class MenuItem {
    Command command;
    public void setCommand(Command command){
        this.command = command;
    }
    public void click(){
        command.execute();
    }
}
//  使用情况
        //  菜单
        Menu menu = new Menu();
        //  公告板系统界面
        BoardScreen boardScreen = new BoardScreen();
        //  命令
        Command open = new OpenCommand(boardScreen);
        Command create = new CreateCommand(boardScreen);
        Command edit = new EditCommand(boardScreen);

        //  菜单项
        MenuItem menuItem1 = new MenuItem();
        menuItem1.setCommand(open);
        MenuItem menuItem2 = new MenuItem();
        menuItem2.setCommand(create);
        MenuItem menuItem3 = new MenuItem();
        menuItem3.setCommand(edit);

        //  为菜单添加菜单项
        menu.addMenuItem("open",menuItem1);
        menu.addMenuItem("create",menuItem2);
        menu.addMenuItem("edit",menuItem3);

        //  open
        menu.getMenuItem("open").click();
        //  create
        menu.getMenuItem("create").click();
        //  edit
        menu.getMenuItem("edit").click();

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

类图

设计模式3

代码说明

//  聊天室
public class ChatRoom {
    //  用户列表
    private ArrayList<Member> member = new ArrayList<>();

    //  注册用户
    public void registerMember(Member member){
        this.member.add(member);
    }

    //  发送文字
    public boolean sendText(String text){
        if (filterText(text)) return false;
        else {
            //  发送文字
            return true;
        }
    }
    //  过滤文字
    private boolean filterText(String text){
        //  过滤状态
        boolean filter = false;
        //  过滤操作

        // 文字不合法
        if (filter)return true;
        //  文字合法
        else return false;
    }
    //  发送图片
    public boolean sendImg(File img){
        if (filterImg(img)) return false;
        else {
            //  发送图片
            return true;
        }
    }
    //  过滤图片
    private boolean filterImg(File img){
        //  过滤状态
        boolean filter = false;
        //  过滤操作

        // 图片不合法
        if (filter)return true;
        //  图片合法
        else return false;
    }

}
//  会员接口
public interface Member {
    void connect(ChatRoom chatRoom);
    void sendText(String text);
    void sendImg(File img);
}
//  普通会员
public class CommonMember implements Member {
    ChatRoom chatRoom;

    //  建立连接
    @Override
    public void connect(ChatRoom chatRoom){
        this.chatRoom = chatRoom;
        this.chatRoom.registerMember(this);
    }

    @Override
    public void sendText(String text){
        if (chatRoom.sendText(text)){
            System.out.println("发送成功");
        }else {
            System.out.println("发送失败");
        }
    }

    @Override
    public void sendImg(File img) {
        System.out.println("不能发送图片");
    }
}
//  钻石会员
public class DiamondMember extends CommonMember {
    @Override
    public void sendImg(File img){
        if (chatRoom.sendImg(img)){
            System.out.println("发送成功");
        }else {
            System.out.println("发送失败");
        }
    }
}
//  客户端
        //  建立聊天室
        ChatRoom chatRoom = new ChatRoom();
        //  普通会员
        CommonMember commonMember = new CommonMember();
        commonMember.connect(chatRoom);
        commonMember.sendText("我是普通会员");
        //  钻石会员
        DiamondMember diamondMember = new DiamondMember();
        diamondMember.connect(chatRoom);
        diamondMember.sendText("我是钻石会员");
        diamondMember.sendImg(new File("我是钻石会员要发送的图片"));

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

类图

设计模式3

代码说明

//  折扣接口
public interface Book {
    double discount(double price);
}
//  计算机类折扣
public class ComputerBook implements Book {
    @Override
    public double discount(double price) {
        return price * 0.9;
    }
}

//  语言类图书折扣
public class LanguageBook implements Book {
    @Override
    public double discount(double price) {
        return price - 2;
    }
}

//  小说类图书折扣
public class NovelBook implements Book {
    @Override
    public double discount(double price) {
        return price - Math.floor(price/100) * 15;
    }
}
//  策略器
public class Price {
    private Book book;
    public Price(Book book){
        this.book = book;
    }
    public double discount(double price){
        return book.discount(price);
    }
}
//  使用情况
        //  三种图书
        Book book1 = new ComputerBook();
        Book book2 = new LanguageBook();
        Book book3 = new NovelBook();
        //  原价
        double bookPrice = 300;
        //  现价
        double bookPriceNew;
        //  计算机类图书
        Price price1 = new Price(book1);
        bookPriceNew = price1.discount(bookPrice);
        System.out.println("计算机类图书原价"+bookPrice+",现价"+bookPriceNew);
        //  语言类图书
        Price price2 = new Price(book2);
        bookPriceNew = price2.discount(bookPrice);
        System.out.println("语言类图书原价"+bookPrice+",现价"+bookPriceNew);
        //  小说类图书
        Price price3 = new Price(book3);
        bookPriceNew = price3.discount(bookPrice);
        System.out.println("小说类图书原价"+bookPrice+",现价"+bookPriceNew);
//  运行结果
计算机类图书原价300.0,现价270.0
语言类图书原价300.0,现价298.0
小说类图书原价300.0,现价255.0

相关文章:

  • 2022-01-30
  • 2021-05-29
  • 2021-11-12
猜你喜欢
  • 2021-12-12
  • 2021-06-29
  • 2021-05-27
  • 2021-11-10
  • 2021-03-31
相关资源
相似解决方案