设计模式第三次作业

设计模式第三次作业

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

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

    类图:1249529-20171124131425375-548076324.png

关键类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模式来设计。

    类图:1249529-20171124131434468-1002956219.png

关键类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模式来设计。

    类图:1249529-20171124131448343-1419685008.png

关键类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模式来设计。

    类图:1249529-20171124131456078-1061232936.png

关键类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

转载于:https://www.cnblogs.com/zlxbky/p/7890134.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式 (含有相关源码) Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 Adapter:将一个类的接口转换成客户希望的另一个接口,使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。 Bridge:将抽象部分与它的实部分分离,使之可以独立变化。 Chain of Responsibility:为解除请求的发送者和接收者之间的耦合,而使多个对象有机会处理这个请求。将这些请求连成一个链,并沿着这条链传递该请求,直到有个对象处理它。 Command:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可以取消的操作。 Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。 Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式比生成子类方式更加灵活。 Facade:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,使得这个子系统更加容易使用。 Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method让一个类的实例化延迟到子类。 Flyweight:运用共享技术有效的支持大量细粒度的对象。 Interpreter:给定一个语言,定义它的文法的一种表示,并定义一个解释器用于解释特定文法。 Iterator:提供一种方法顺序访问一个聚合对象中的各种元素,而无需暴露该对象的内部表示。 Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式相互引用,从而使得耦合松散,可以独立改变相互之间的交互。 Memento:不破坏封装的前提下,捕获对象的内部状态,并在该对象之外保存这个状态。 Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生变化时依赖于它的所有的对象都得到通知和刷新。 Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。 Proxy:为其他对象提供一个代理以控制对这个对象的访问。 Singleton:保证一个类仅有一个实例,并提供一个访问它的全局点。 State:允许一个对象再内部状态改变的时候改变它的行为。对象看起来似乎修改了所属的类。 Strategy:定义一系列的算法,把他们封装起来,并可以相互替换,使算法独立于客户。 Template Method:定义一个操作中的算法骨架,而将这些算法的具体实的代码延迟到子类中完成。 Visitor:标识一个作用于某对象结构中的各元素的操作,在不改变各元素的类的前提下定义作用于这个元素的新操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值