设计模式实验参考答案

组合模式

Entry

public abstract class Entry {
   public abstract String getName(Entry file);
   public abstract int getSize(Entry file);
   public abstract void printList();
   public abstract void add(Entry file);
}

Directory

import java.util.ArrayList;
public class Directory extends Entry{
   private ArrayList<Entry> filelist=new ArrayList<Entry>();
   private String name;
   public Directory(String name) {
       this.name=name;
   }
   @Override
   public String getName(Entry file) {
       return name;
   }
   @Override
   public int getSize(Entry file) {
       return 0;
   }
   @Override
   public void printList() {
       System.out.println("****对文件夹 "+name+"正被读取");
       for(Object obj:filelist){
           ((Entry)obj).printList();
       }
   }
   @Override
   public void add(Entry file) {
       filelist.add(file);
   }
}

File

public class File extends Entry{
   private String name;
   private int size;
   public File(String name,int size)
   {
       this.name = name;
       this.size = size;
   }
   @Override
   public String getName(Entry file) {
       return name;
   }
   @Override
   public int getSize(Entry file) {
       return size;
   }
   @Override
   public void printList() {
       System.out.println("文件名: "+name+"     文件大小:"+size);
   }
   @Override
   public void add(Entry file) {
       System.out.println("对不起,不支持该方法");
   }
}

Main

public class Main {
   public static void main(String[] args) {
       Entry file1,file2,file3,file4,file5,directory1,directory2,directory3,directory4;
       directory1=new Directory("总资料");
       directory2=new Directory("图像文件");
       directory3 = new Directory("文本文件");
       directory4 = new Directory("视频文件");
       file1=new File("壁纸.jpg",110);
       file2=new File("图文.jif",300);
       file3=new File("网文.txt",90);
       file4=new File("实验报告.doc",111);
       file5=new File("电影.rmvb",1000);
       directory2.add(file1);
       directory2.add(file2);
       directory3.add(file3);
       directory3.add(file4);
       directory4.add(file5);
       directory1.add(directory2);
       directory1.add(directory3);
       directory1.add(directory4);
       directory1.printList();
   }
}

装饰者模式

Decorator

package Decorator;
public abstract class Display {
    public abstract int getColumns(); 
    public abstract int getRows(); 
    public abstract String getRowText(int row); 
    public void show()
    { 
        for (int i = 0; i < getRows(); i++) {
            System.out.println(getRowText(i));
        }
    }
}

StringDisplay

package Decorator;
public class StringDisplay extends Display{
    private String string;
    public StringDisplay(String string) 
    {
        this.string = string;
    }
    public int getColumns()
    {
        return string.length();
    }
    public int getRows()
    {
    return 1;
    }
    public  String getRowText(int row)
    {
    if (row == 0) 
             return string;     
    else
             return null;
    }
   
  }

Border

package Decorator;
public abstract class Border extends Display{
protected Display display;
    protected Border(Display display)
    {
        this.display = display;
    }
}

SideBorder

package Decorator;
public class SideBorder extends Border {
    private char borderChar;
    protected SideBorder(Display display, char char1)
    {
        super(display);
        this.borderChar = char1;
    }
    public int getColumns() 
    {
        return display.getColumns() + 2; 
    }
    public int getRows() 
    {
        return display.getRows(); 
    }
    public String getRowText(int row)
    {
        return borderChar + display.getRowText(row) + borderChar;
    }
}

FullBorder

package Decorator;
public class FullBorder extends Border {
public FullBorder(Display display) 
    {
        super(display);
    }
    public int getColumns() 
    {
        return display.getColumns() + 2;
    }
    public int getRows() 
    {
        return display.getRows() + 2;
    }
    public String getRowText(int row)
    {
        if (row == 0) {
            return '+' + makeLine('-', display.getColumns()) + '+'; 
        } else if (row == display.getRows() + 1) {
            return '+' + makeLine('-', display.getColumns()) + '+'; 
        } else {
            return '|' + display.getRowText(row - 1) + '|'; 
        }
    }
    private String makeLine(char ch, int count)
    {
        StringBuilder bulider = new StringBuilder();
        for (int i = 0; i < count; i++) {
            bulider.append(ch);
        }
        return bulider.toString();
    }
}

Main

package Decorator;
public class Main {
public static void main(String[] args) {
        Display d1 = new StringDisplay("Hello, world.");
        d1.show();

        Display d2 = new SideBorder (d1, '|');

        d2.show();

        Display d3 = new FullBorder(d2);

        d3.show();

    }

}

职责链模式

Support

public abstract class Support {
   private String name;
   private Support next;

   public Support(String name) {
       this.name = name;
   }
   public Support setNext(Support next) {
       this.next = next;
       return next;
   }
   public final void support(Trouble trouble) {
       if (resolve(trouble)) {
           done(trouble);
       } else if (next != null) {
           next.support(trouble);         } else {
           fail(trouble);
       }
   }
   public abstract boolean resolve(Trouble trouble);
   protected void done(Trouble trouble) {
       System.out.println(trouble + " is resolved by " + this + ".");
   }
   protected void fail(Trouble trouble) {
       System.out.println(trouble + " cannot be resolved.");
   }
   @Override
   public String toString() {
       return "[" + name + "]";
   }
}

OddSupport

public class OddSupport extends Support {
   public OddSupport(String name) {
       super(name);
   }
   @Override
   public boolean resolve(Trouble trouble) {
       if (trouble.getNumber() % 2 == 1) {
           //...
           return true;
       }
       return false;
   }
}

SpecialSupport

public class SpecialSupport extends Support{
   private int number;
   public SpecialSupport(String name, int number) {
       super(name);
       this.number = number;
   }
   @Override
   public boolean resolve(Trouble trouble) {
       if (number == trouble.getNumber()) {
           // ...
           return true;
       }
       return false;
   }
}

Main

public class Main {
   public static void main(String[] args) {
       Support alice = new NoSupport("Alice");
       Support bob = new LimitSupport("Bob", 100);
       Support charlie = new SpecialSupport("Charlie", 429);
       Support diana = new LimitSupport("Diana", 200);
       Support elmo = new OddSupport("Elmo");
       Support fred = new LimitSupport("Fred", 300);
       alice.setNext(bob).setNext(charlie).setNext(diana).setNext(elmo).setNext(fred);
       for (int i = 0; i < 500; i += 33) {
           alice.support(new Trouble(i));
       }
   }
}

迭代器模式

Iterator

public interface Iterator<T> {
   boolean hasNext();
   T next();
}

Aggregate

public interface Aggregate {
   Iterator iterator();
}

BookShelfIterator

public class BookShelfIterator implements Iterator<Book> {
   private BookShelf bookShelf;
   private Integer index;
   public BookShelfIterator(BookShelf bookShelf) {
       this.bookShelf = bookShelf;
       this.index = 0;
   }
   public boolean hasNext() {
       return index < bookShelf.length();
   }
   public Book next() {
       return bookShelf.get(index++);
   }
}

BookShelf

import java.util.ArrayList;
import java.util.List;

public class BookShelf implements Aggregate {
   private List<Book> books = new ArrayList<Book>();
   public Integer length() {
       return books.size();
   }
   public Book get(Integer index) {
       return books.get(index);
   }
   public void add(Book book) {
       books.add(book);
   }
   public Iterator iterator() {
       return new BookShelfIterator(this);
   }
}

Book

public class Book {
   private String name;
   public Book(String name) {
       this.name = name;
   }
   public String getName() {
       return name;
   }
}

Main

public class Main {
   public static void main(String[] args) {
       BookShelf bookShelf =new BookShelf();
       bookShelf.add(new Book("Java"));
       bookShelf.add(new Book("设计模式"));
       bookShelf.add(new Book("计算机网络"));
       bookShelf.add(new Book("数据结构"));
       bookShelf.add(new Book("数学建模"));

       Iterator iterator = bookShelf.iterator();
       while (iterator.hasNext()){
           Book next = (Book) iterator.next();
           System.out.println(next.getName());
       }
   }
}

观察者模式

Observer

public interface Observer {
   void upadate(NumberGenerator generator);
}

NumberGenerator
import java.util.ArrayList;
import java.util.List;

public abstract class NumberGenerator {
   private List<Observer> observers = new ArrayList<>();

   public void addObserer(Observer observer) {
       observers.add(observer);
   }

   public  void deleteObserver(Observer observer) {
       observers.remove(observer);
   }

   // 通知观查者
   public void notifyObservers() {
       observers.forEach(e -> e.upadate(this));
   }

   abstract int getNumber();
   abstract void execute();
}

DigitObserver

import java.util.concurrent.TimeUnit;
public class DigitObserver implements Observer {
   @Override
   public void upadate(NumberGenerator generator) {
       System.out.println("DigitObserver:" + generator.getNumber());
       try {
           TimeUnit.MICROSECONDS.sleep(100);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }
}

GraphObserver

import java.util.concurrent.TimeUnit;
public class GraphObserver implements Observer {
   @Override
   public void upadate(NumberGenerator generator) {
       System.out.print("GraphObserver:");
       int count = generator.getNumber();
       for (int i = 0; i < count; i++) {
           System.out.print('*');
       }
       System.out.println();
       try {
           TimeUnit.MICROSECONDS.sleep(100);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }
}

RandomNumberGenerator

import java.util.Random;
public class RandomNumberGenerator extends NumberGenerator {
   private Random random = new Random();
   private int number;
   @Override
   int getNumber() {
       return number;
   }
   @Override
   void execute() {
       for (int i = 0; i < 20; i++) {
           number = random.nextInt(50);
           notifyObservers();
       }
   }
}

Main

public class Main {
   public static void main(String[] args) {
       RandomNumberGenerator generator = new RandomNumberGenerator();
       Observer digitObserver = new DigitObserver();
       Observer graphObserver = new GraphObserver();
       generator.addObserer(digitObserver);
       generator.addObserer(graphObserver);
       generator.execute();
   }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值