设计模式课后习题
建造者模式课后第一题:产品类:public class GamePerson {private String face;private String gender;private String cloth;public String getFace() {return face;}public void setFace(String face) {this.face = face;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getCloth() {return cloth;}public void setCloth(String cloth) {this.cloth = cloth;}}抽象建造类:public abstract class PersonCreate {protected GamePerson person=new GamePerson();public abstract void createFace();public abstract void createGender();public abstract void createCloth();public GamePerson getPerson(){return person;}}具体建造者类:public class PersonType1 extends PersonCreate { public void createFace() {person.setFace("瓜子脸");}public void createGender() {person.setGender("美女");}public void createCloth() {person.setCloth("洛丽塔");}}具体建造类:public class PersonType2 extends PersonCreate { public void createFace() {person.setFace("国字脸");}public void createGender() {person.setGender("帅哥");}public void createCloth() {person.setCloth("西装革履");}}指挥者类:public class GamePlayer {private PersonCreate pc;public void choseType(PersonCreate pc){ this.pc=pc;}public GamePerson create(){pc.createCloth();pc.createFace();pc.createGender();return pc.getPerson();}}测试类:public class Test {public static void main(String[] args) { PersonCreate pc=new PersonType1();GamePlayer gp=new GamePlayer();gp.choseType(pc);GamePerson person=gp.create();System.out.println("游戏人物特征:");System.out.println("长着一张"+person.getFace()+"穿着"+person.getCloth()+"的"+person.getGender());}}课后第二题:产品类:public class Computer {private String cpu;private String storage;public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}public String getStorage() {return storage;}public void setStorage(String storage) {this.storage = storage;}}抽象建造类:public abstract class Factory {protected Computer c=new Computer();public abstract void installCpu();public abstract void installStorage();public Computer getComputer(){return c;}}具体建造者类:public class Desktop extends Factory {public void installCpu() {c.setCpu("AMD");}public void installStorage() {c.setStorage("8G内存");}}具体建造类:public class Laptop extends Factory {public void installCpu() {c.setCpu("intel");}public void installStorage() {c.setStorage("1G内存");}}指挥者类:public class User {private Factory f;public void buy(Factory f){this.f=f;}public Computer con(){f.installCpu();f.installStorage();return f.getComputer();}}测试类:public class Test {public static void main(String[] args) {Factory f=new Laptop();User u=new User();u.buy(f);Computer c=u.con();System.out.println(c.getCpu()+" "+c.getStorage());}}单例模式课后第一题:懒汉式模式:public class SingletonWindow extends JInternalFrame { private static SingletonWindow instance=null;private SingletonWindow() {super("内部窗口",true,true,true);System.out.println("创建了一个内部窗体");}public static SingletonWindow getInstance(){if(instance==null){instance=new SingletonWindow();}else{System.out.println("已经创建了一个内部窗体!");}return instance;}}测试类:public class Main extends JFrame {private static final long serialVersionUID = 1L;private JButton btnAdd;private JPanel btnpl;private JDesktopPane dtp;private JInternalFrame itf;public Main() {this.setSize(new Dimension(600, 700));this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setResizable(false);this.setVisible(true);;this.setLocationRelativeTo(this);this.setTitle("实验2");this.setLayout(null);this.dtp=new JDesktopPane();this.dtp.setBounds(new Rectangle(0, 0, 600, 600));this.btnpl=new JPanel();this.btnpl.setBounds(new Rectangle(0, 600, 600, 100));this.btnAdd=new JButton("添加一个内部窗体");this.btnAdd.setBounds(new Rectangle(10, 10, 150, 30));this.add(dtp);this.add(btnpl);this.btnpl.add(btnAdd);this.btnAdd.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {itf=SingletonWindow.getInstance();itf.setSize(200, 200);itf.setVisible(true);dtp.add(itf);}});}public static void main(String[] args) {new Main();}}适配器模式课后第一题目标抽象类:public abstract class Robot {public abstract void run();public abstract void cry();}适配者类:public class Dog {public void run(){System.out.println("狗跑");}}public class Bird {public void cry(){System.out.println("鸟叫");}}适配器类:public class RobotAdapter extends Robot {private Bird bird;private Dog dog;public RobotAdapter(Bird bird,Dog dog) {this.bird=bird;this.dog=dog;}public void run() {System.out.print("机器人学");dog.run();}public void cry() {System.out.print("机器人学");bird.cry();}}测试类:public class Test {public static void main(String[] args) {Bird bird=new Bird();Dog dog=new Dog();RobotAdapter adapter=new RobotAdapter(bird, dog);adapter.run();adapter.cry();}}组合模式课后习题一public abstract class MyElement {public abstract void eat();public abstract void add(MyElement element);public abstract void remove(MyElement element);}public class Apple extends MyElement {public void eat() {System.out.println("吃苹果");}public void add(MyElement element) {}public void remove(MyElement element) {}}public class Banana extends MyElement {public void eat() {System.out.println("吃香蕉");}public void add(MyElement element) {}public void remove(MyElement element) {}}public class Pear extends MyElement { public void eat() {System.out.println("吃梨子");}public void add(MyElement element) {}public void remove(MyElement element) {}}public class Plate extends MyElement { private ArrayList list=new ArrayList();public void eat() {for (Object object : list) {((MyElement)object).eat();}}public void add(MyElement element) {list.add(element);}public void remove(MyElement element) { list.remove(element);}}测试类:public class Client {public static void main(String[] args) { MyElement obj1,obj2,obj3,obj4,obj5;Plate plate1,plate2,plate3;obj1=new Apple();obj2=new Pear();obj3=new Banana();plate1=new Plate();plate1.add(obj1);plate1.add(obj2);plate1.add(obj3);obj4=new Apple();obj5=new Banana();plate2=new Plate();plate3=new Plate();plate2.add(obj4);plate2.add(obj5);plate3.add(plate1);plate3.add(plate2);plate3.eat();}}课后习题二public abstract class AbstractFile {public abstract void add(AbstractFile file );public abstract void delete(AbstractFile file);public abstract void lookThrough();public abstract String getfileName();}public class ImageFile extends AbstractFile { private String fileName;public ImageFile(String fileName) {this.fileName=fileName;}public void add(AbstractFile file) {}public void delete(AbstractFile file) {}public void lookThrough() {}public String getfileName() {return fileName;}}public class TextFile extends AbstractFile{private String fileName;public TextFile(String fileName) {this.fileName=fileName;}public void add(AbstractFile file) {}public void delete(AbstractFile file) {}public void lookThrough() {}public String getfileName() {return fileName;}}public class VedioFile extends AbstractFile{private String fileName;public VedioFile(String fileName) {this.fileName=fileName;}public void add(AbstractFile file) {}public void delete(AbstractFile file) {}public void lookThrough() {}public String getfileName() {return fileName;}}public class Folder extends AbstractFile{private ArrayList<AbstractFile> list=new ArrayList<AbstractFile>();private String fileName;public Folder(String fileName) {this.fileName=fileName;}public void add(AbstractFile file) {list.add(file);}public void delete(AbstractFile file) {list.remove(file);}public void lookThrough() {System.out.println("正在浏览"+fileName+"文件夹,有以下文件");Iterator i=list.iterator();if(!(i.hasNext())){System.out.println("暂无任何文件");}for (AbstractFile abstractFile : list) {System.out.println(abstractFile.getfileName());}}public String getfileName() {return fileName;}}测试类:public class Main {public static void main(String[] args) {// TODO Auto-generated method stubAbstractFile img1=new ImageFile("美女.jpg");AbstractFile vedio=new VedioFile("xxx.avi");AbstractFile txt=new TextFile("凡人修仙传.txt");AbstractFile folder=new Folder("娱乐");folder.add(img1);folder.add(txt);folder.add(vedio);System.out.println("---------------------");folder.lookThrough();System.out.println("---------------------");folder.delete(txt);folder.delete(vedio);folder.delete(img1);System.out.println("---------------------");folder.lookThrough();}}装饰模式课后习题一抽象构建类:public interface Transform {public void move();}具体构建类:public class Car implements Transform {public Car() {System.out.println("变形金刚是一辆车");}public void move() {System.out.println("在陆地上移动");}}抽象装饰类:public class Changer implements Transform { private Transform transform;public Changer(Transform transform) {this.transform=transform;}public void move() {transform.move();}}具体装饰类:public class Doctor extends Robot {public Doctor(Transform transform) {super(transform);System.out.println("变成医生机器人");}public void cure(){System.out.println("我正在治疗");}}public class Robot extends Changer {public Robot(Transform transform) {super(transform);}public void say(){System.out.println("说话");}}public class Airplane extends Changer {public Airplane(Transform transform) {super(transform);System.out.println("变成飞机");}public void fly(){System.out.println("在空中飞翔");}}测试类:public class Test {public static void main(String[] args) {Transform transform;transform=new Car();Changer c=new Changer(transform);Robot r=new Robot(c);Doctor d=new Doctor(r);d.move();d.say();d.cure();}}课后习题二:抽象构建类:public interface AbstractBook {public void borrowBook();public void returnBook();}具体构建类:public class Book implements AbstractBook { public void borrowBook() {System.out.println("借书方法");}public void returnBook() {System.out.println("还书方法");}}抽象装饰类:public class AddFunction implements AbstractBook { private AbstractBook ab;public AddFunction(AbstractBook ab) {this.ab=ab;}public void borrowBook() {ab.borrowBook();}public void returnBook() {ab.returnBook();}}具体装饰类:public class AddFreeze extends AddFunction { public AddFreeze(AbstractBook ab) {super(ab);System.out.println("添加了冻结方法");}public void freeze(){System.out.println("冻结方法");}}public class AddLose extends AddFunction { public AddLose(AbstractBook ab) {super(ab);System.out.println("添加了遗失方法");}public void lose(){System.out.println("遗失方法");}}测试类:public class Test {public static void main(String[] args) { AbstractBook ab;ab=new Book();ab.borrowBook();ab.returnBook();System.out.println("--------");AddFreeze af=new AddFreeze(ab);af.borrowBook();af.returnBook();af.freeze();System.out.println("---------");AddLose al=new AddLose(ab);al.borrowBook();al.returnBook();al.lose();}}外观模式课后习题一:子系统类:public class FileWrite {public void write(){System.out.println("文件正在保存。
《设计模式》刘伟 实验参考答案
《设计模式》刘伟 实验参考答案实验 11.在某图形库 API 中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:在该图形库中,每个图形类(如 Circle 、Triangle 等)的 init()方法用于初始化所创建的图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize() 方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:① 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;② 在图形库中增加并使用新的图形时需要修改客户类源代码;③ 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:① 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;② 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
参考答案: Ci rcle + + + + +in it () setColor () f ill setSize () displa y () void void void void void Trian gle + + + + +in it () setColor () f ill setSize () displa y () void void void void void Rectangl e + + + + +in it () setColor () f ill setSize () displa y () void void void void void Cl ient2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形 (Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,抛出一个 UnsupportedShapeException 异常,绘制类图并编程模拟实现。
《设计模式》刘伟 实验参考答案
《设计模式》刘伟 实验参考答案实验 11.在某图形库 API 中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:在该图形库中,每个图形类(如 Circle 、Triangle 等)的 init()方法用于初始化所创建的图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize() 方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:① 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;② 在图形库中增加并使用新的图形时需要修改客户类源代码;③ 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:① 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;② 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
参考答案:Circle+ + + + +init () setColor () fill () setSize () display () : void void : void : void : void: Triangle+ + + + +init () setColor () fill () setSize () display () void: : void void : void : void: Rectangle + + + + +init () setColor () fill () setSize () display () void: void : : void : void : voidClient2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形 (Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,抛出一个 UnsupportedShapeException 异常,绘制类图并编程模拟实现。
《设计模式》刘伟-实验参考答案
《设计模式》刘伟 实验参考答案实验 11.在某图形库 API 中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:在该图形库中,每个图形类(如 Circle 、Triangle 等)的 init()方法用于初始化所创建的图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize() 方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:① 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;② 在图形库中增加并使用新的图形时需要修改客户类源代码;③ 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:① 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;② 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
参考答案:Circle + + + + +init () setColor () fill () setSize () display () : void void : void : void : void : Triangle + + + + +init () setColor () fill () setSize () display () void: : void void : void : void: Rectangle+ + + + +init () setColor () fill () setSize () display () void: void : : void : void : voidClient2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,抛出一个 UnsupportedShapeException 异常,绘制类图并编程模拟实现。
中南大学刘伟《设计模式》实验参考答案
3
SkinFactory
+ createButton () : Button + createTextField () : TextField + createComboBox () : ComboBox
Client
SpringSkinFactory
SummerSkinFactory
+ createButton () : Button + createTextField () : TextField + createComboBox () : ComboBox
+ fill ()
: void
+ setSize () : void
+ display () : void
2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形
(Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制 draw()和擦除 erase()
ShapeFactory + createShape (String type) : Shape
Circle
Rectangle
Triangle
+ draw () : void + erase () : void
+ draw () : void + erase () : void
+ draw () : void + erase () : void
两个方法,要求在绘制不支持的几何图形时,抛出一个 UnsupportedShapeException 异常,
绘制类图并编程模拟实现。
设计模式习题及参考答案
设计模式习题及参考答案《设计模式》复习题⼀、单选题1.不同级别的⽤户对同⼀对象拥有不同的访问权利或某个客户端不能直接操作到某个对象,但⼜必须和那个对象有所互动,这种情况最好使⽤什么设计模式( )A. Bridge模式B. Facade模式C. Adapter模式D. Proxy模式2.模式常⽤的基本设计模式可分为( )A.创建型、结构型和⾏为型B.对象型、结构型和⾏为型C.过程型、结构型和⾏为型D.抽象型、接⼝型和实现型3.以下哪个模式是利⽤⼀个对象,快速地⽣成⼀批对象( )A. 抽象⼯⼚(Abstract Factory)模式B. 合成(Composite)模式C. 原型(Prototype)模式D. 桥接(Bridge)模式4.以下不属于结构型模式是( )A. COMPOSITE(组合)B. ADAPTER(适配器)C. FLYWEIGHT(享元)D. SINGLETON(单例)5.以下意图那个是⽤来描述ABSTRACT FACTORY(抽象⼯⼚)模式( ) 。
A.提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽽⽆需指定它们具体的类。
B.定义⼀个⽤于创建对象的接⼝,让⼦类决定实例化哪⼀个类。
C.将⼀个类的接⼝转换成客户希望的另外⼀个接⼝。
D.表⽰⼀个作⽤于某对象结构中的各元素的操作。
6.设计模式的两⼤主题是( )A.系统的维护与开发 B 对象组合与类的继承C.系统架构与系统开发D.系统复⽤与系统扩展7.外观模式的作⽤是()A.当不能采⽤⽣成⼦类的⽅法进⾏扩充时,动态地给⼀个对象添加⼀些额外的功能。
B.为了系统中的⼀组功能调⽤提供⼀个⼀致的接⼝,这个接⼝使得这⼀⼦系统更加容易使⽤。
C.保证⼀个类仅有⼀个实例,并提供⼀个访问他的全局访问点。
D.在⽅法中定义算法的框架,⽽将算法中的⼀些操作步骤延迟到⼦类中实现某软件公司欲设计⼀款图像处理软件,帮助⽤户对拍摄的照⽚进⾏后期处理。
在软件需求分析阶段,公司的系统分析师识别出了如下3个关键需求:图像处理软件需要记录⽤户在处理照⽚时所有动作,并能够⽀持⽤户动作的撤销与重做等⾏为。
设计模式习题
设计模式习题1、设计模式一般用来解决什么样的问题( a)A.同一问题的不同表相B不同问题的同一表相C.不同问题的不同表相D.以上都不是2、下列属于面向对象基本原则的是( c )A.继承B.封装C.里氏代换 D都不是3、Open-Close原则的含义是一个软件实体( a )A.应当对扩展开放,对修改关闭.B.应当对修改开放,对扩展关闭C.应当对继承开放,对修改关闭D.以上都不对4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( a )模式。
A.创建型B.结构型 C行为型 D.以上都可以5、要依赖于抽象,不要依赖于具体。
即针对接口编程,不要针对实现编程,是( d )的表述A.开-闭原则B.接口隔离原则C.里氏代换原则D.依赖倒转原则6、依据设计模式思想,程序开发中应优先使用的是( a )关系实现复用。
A,委派 B.继承C创建 D.以上都不对复用方式:继承和组合聚合(组合委派)7、设计模式的两大主题是( d )A.系统的维护与开发 B 对象组合与类的继承C.系统架构与系统开发D.系统复用与系统扩展8、单子模式中,两个基本要点( a b )和单子类自己提供单例A.构造函数私有B.唯一实例C.静态工厂方法D.以上都不对9、下列模式中,属于行为模式的是( b )A.工厂模式B观察者 C适配器以上都是10、“不要和陌生人说话” 是( d )原则的通俗表述A.接口隔离B.里氏代换C.依赖倒转D.迪米特:一个对象应对其他对象尽可能少的了解11、构造者的的退化模式是通过合并( c )角色完成退化的。
A.抽象产品B产品C创建者D使用者12、单子(单例,单态)模式类图结构如下:下列论述中,关于”0..1”表述的不正确的是( d )A.1表示,一个单例类中,最多可以有一个实例.B.”0..1”表示单例类中有不多于一个的实例C.0表示单例类中可以没有任何实例D.0表示单例类可以提供其他非自身的实例13、对象适配器模式是( a )原则的典型应用。
《设计模式》刘伟 实验参考答案
《设计模式》刘伟 实验参考答案实验 11.在某图形库 API 中提供了多种矢量图模板,用户可以基于这些矢量图创建不同的显示图形,图形库设计人员设计的初始类图如下所示:在该图形库中,每个图形类(如 Circle 、Triangle 等)的 init()方法用于初始化所创建的图形, setColor()方法用于给图形设置边框颜色,fill()方法用于给图形设置填充颜色,setSize() 方法用于设置图形的大小,display()方法用于显示图形。
客户类(Client)在使用该图形库时发现存在如下问题:① 由于在创建窗口时每次只需要使用图形库中的一种图形,因此在更换图形时需要修改客户类源代码;② 在图形库中增加并使用新的图形时需要修改客户类源代码;③ 客户类在每次使用图形对象之前需要先创建图形对象,有些图形的创建过程较为复杂,导致客户类代码冗长且难以维护。
现需要根据面向对象设计原则对该系统进行重构,要求如下:① 隔离图形的创建和使用,将图形的创建过程封装在专门的类中,客户类在使用图形时无须直接创建图形对象,甚至不需要关心具体图形类类名;② 客户类能够方便地更换图形或使用新增图形,无须针对具体图形类编程,符合开闭原则。
绘制重构之后的类图并说明在重构过程中所运用的面向对象设计原则。
参考答案:Circle+ + + + +init () setColor () fill () setSize () display () : void void : void : void : void: Triangle+ + + + +init () setColor () fill () setSize () display () void: : void void : void : void: Rectangle + + + + +init () setColor () fill () setSize () display () void: void : : void : void : voidClient2.使用简单工厂模式设计一个可以创建不同几何形状(Shape),如圆形(Circle)、矩形 (Rectangle)和三角形(Triangle)等的绘图工具类,每个几何图形均具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,抛出一个 UnsupportedShapeException 异常,绘制类图并编程模拟实现。
设计模式习题及参考答案
《设计模式》复习题一、单选题1.不同级别的用户对同一对象拥有不同的访问权利或某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动,这种情况最好使用什么设计模式( )A. Bridge模式B. Facade模式C. Adapter模式D. Proxy模式2.模式常用的基本设计模式可分为( )A.创建型、结构型和行为型B.对象型、结构型和行为型C.过程型、结构型和行为型D.抽象型、接口型和实现型3.以下哪个模式是利用一个对象,快速地生成一批对象( )A. 抽象工厂(Abstract Factory)模式B. 合成(Composite)模式C. 原型(Prototype)模式D. 桥接(Bridge)模式4.以下不属于结构型模式是( )A. COMPOSITE(组合)B. ADAPTER(适配器)C. FLYWEIGHT(享元)D. SINGLETON(单例)5.以下意图那个是用来描述ABSTRACT FACTORY(抽象工厂)模式( ) 。
A.提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
B.定义一个用于创建对象的接口,让子类决定实例化哪一个类。
C.将一个类的接口转换成客户希望的另外一个接口。
D.表示一个作用于某对象结构中的各元素的操作。
6.设计模式的两大主题是( )A.系统的维护与开发 B 对象组合与类的继承C.系统架构与系统开发D.系统复用与系统扩展7.外观模式的作用是()A.当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些额外的功能。
B.为了系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用。
C.保证一个类仅有一个实例,并提供一个访问他的全局访问点。
D.在方法中定义算法的框架,而将算法中的一些操作步骤延迟到子类中实现某软件公司欲设计一款图像处理软件,帮助用户对拍摄的照片进行后期处理。
在软件需求分析阶段,公司的系统分析师识别出了如下3个关键需求:图像处理软件需要记录用户在处理照片时所有动作,并能够支持用户动作的撤销与重做等行为。
Java 设计模式练习题及答案
Java 设计模式练习题及答案在学习Java设计模式时,练习题是非常重要的一部分。
通过练习题的实践,可以更好地理解和应用设计模式,提升自己的编程能力。
本文将介绍一些Java设计模式练习题,并提供相应的答案,希望能对读者在设计模式的学习和实践中有所帮助。
一、题目一:单例模式——懒汉式实现问题描述:请编写一个线程安全的懒汉式单例模式。
解答示例:```javapublic class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}}```二、题目二:工厂模式——简单工厂实现问题描述:请使用简单工厂模式实现一个计算器,支持加减乘除四种运算。
解答示例:```javapublic class CalculatorFactory {public static Calculator createCalculator(String operator) {Calculator calculator = null;switch (operator) {case "+":calculator = new AddCalculator();break;case "-":calculator = new SubtractCalculator();break;case "*":calculator = new MultiplyCalculator();break;case "/":calculator = new DivideCalculator();break;}return calculator;}}public interface Calculator {double calculate(double num1, double num2);}public class AddCalculator implements Calculator {@Overridepublic double calculate(double num1, double num2) { return num1 + num2;}}public class SubtractCalculator implements Calculator { @Overridepublic double calculate(double num1, double num2) {return num1 - num2;}}// MultiplyCalculator和DivideCalculator类似,省略代码// 使用示例Calculator calculator = CalculatorFactory.createCalculator("+");double result = calculator.calculate(2, 3); // 结果为5```三、题目三:观察者模式问题描述:请设计一个简单的气象站系统,该系统需要实现以下功能:1. 可以添加观察者并实时更新气象数据;2. 当气象数据发生变化时,自动通知所有观察者进行更新。
设计模式课后习题
建造者模式课后第一题:产品类:public class GamePerson {private String face;private String gender;private String cloth;public String getFace() {return face;}public void setFace(String face) {this.face = face;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getCloth() {return cloth;}public void setCloth(String cloth) {this.cloth = cloth;}}抽象建造类:public abstract class PersonCreate {protected GamePerson person=new GamePerson();public abstract void createFace();public abstract void createGender();public abstract void createCloth();public GamePerson getPerson(){return person;}}具体建造者类:public class PersonType1 extends PersonCreate { public void createFace() {person.setFace("瓜子脸");}public void createGender() {person.setGender("美女");}public void createCloth() {person.setCloth("洛丽塔");}}具体建造类:public class PersonType2 extends PersonCreate { public void createFace() {person.setFace("国字脸");}public void createGender() {person.setGender("帅哥");}public void createCloth() {person.setCloth("西装革履");}}指挥者类:public class GamePlayer {private PersonCreate pc;public void choseType(PersonCreate pc){this.pc=pc;}public GamePerson create(){pc.createCloth();pc.createFace();pc.createGender();return pc.getPerson();}}测试类:public class Test {public static void main(String[] args) {PersonCreate pc=new PersonType1();GamePlayer gp=new GamePlayer();gp.choseType(pc);GamePerson person=gp.create();System.out.println("游戏人物特征:");System.out.println("长着一张"+person.getFace()+"穿着"+person.getCloth()+"的"+person.getGender());}}课后第二题:产品类:public class Computer {private String cpu;private String storage;public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}public String getStorage() {return storage;}public void setStorage(String storage) {this.storage = storage;}}抽象建造类:public abstract class Factory {protected Computer c=new Computer();public abstract void installCpu();public abstract void installStorage();public Computer getComputer(){return c;}}具体建造者类:public class Desktop extends Factory {public void installCpu() {c.setCpu("AMD");}public void installStorage() {c.setStorage("8G内存");}}具体建造类:public class Laptop extends Factory {public void installCpu() {c.setCpu("intel");}public void installStorage() {c.setStorage("1G内存");}}指挥者类:public class User {private Factory f;public void buy(Factory f){this.f=f;}public Computer con(){f.installCpu();f.installStorage();return f.getComputer();}}测试类:public class Test {public static void main(String[] args) {Factory f=new Laptop();User u=new User();u.buy(f);Computer c=u.con();System.out.println(c.getCpu()+" "+c.getStorage());}}单例模式课后第一题:懒汉式模式:public class SingletonWindow extends JInternalFrame { private static SingletonWindow instance=null;private SingletonWindow() {super("内部窗口",true,true,true);System.out.println("创建了一个内部窗体");}public static SingletonWindow getInstance(){if(instance==null){instance=new SingletonWindow();}else{System.out.println("已经创建了一个内部窗体!");}return instance;}}测试类:public class Main extends JFrame {private static final long serialVersionUID = 1L;private JButton btnAdd;private JPanel btnpl;private JDesktopPane dtp;private JInternalFrame itf;public Main() {this.setSize(new Dimension(600, 700)););this.setDefaultCloseOperation(EXIT_ON_CLOSEthis.setResizable(false);this.setVisible(true);;this.setLocationRelativeTo(this);this.setTitle("实验2");this.setLayout(null);this.dtp=new JDesktopPane();this.dtp.setBounds(new Rectangle(0, 0, 600, 600));this.btnpl=new JPanel();this.btnpl.setBounds(new Rectangle(0, 600, 600, 100));this.btnAdd=new JButton("添加一个内部窗体");this.btnAdd.setBounds(new Rectangle(10, 10, 150, 30));this.add(dtp);this.add(btnpl);this.btnpl.add(btnAdd);this.btnAdd.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {itf=SingletonWindow.getInstance();itf.setSize(200, 200);itf.setVisible(true);dtp.add(itf);}});}public static void main(String[] args) {new Main();}}适配器模式课后第一题目标抽象类:public abstract class Robot {public abstract void run();public abstract void cry();}适配者类:public class Dog {public void run(){System.out.println("狗跑");}}public class Bird {public void cry(){System.out.println("鸟叫");}}适配器类:public class RobotAdapter extends Robot {private Bird bird;private Dog dog;public RobotAdapter(Bird bird,Dog dog) {this.bird=bird;this.dog=dog;}public void run() {System.out.print("机器人学");dog.run();}public void cry() {System.out.print("机器人学");bird.cry();}}测试类:public class Test {public static void main(String[] args) {Bird bird=new Bird();Dog dog=new Dog();RobotAdapter adapter=new RobotAdapter(bird, dog);adapter.run();adapter.cry();}}组合模式课后习题一public abstract class MyElement {public abstract void eat();public abstract void add(MyElement element);public abstract void remove(MyElement element);}public class Apple extends MyElement {public void eat() {System.out.println("吃苹果");}public void add(MyElement element) {}public void remove(MyElement element) {}}public class Banana extends MyElement {public void eat() {System.out.println("吃香蕉");}public void add(MyElement element) {}public void remove(MyElement element) {}}public class Pear extends MyElement {public void eat() {System.out.println("吃梨子");}public void add(MyElement element) {}public void remove(MyElement element) {}}public class Plate extends MyElement {private ArrayList list=new ArrayList();public void eat() {for (Object object : list) {((MyElement)object).eat();}}public void add(MyElement element) {list.add(element);}public void remove(MyElement element) { list.remove(element);}}测试类:public class Client {public static void main(String[] args) {MyElement obj1,obj2,obj3,obj4,obj5;Plate plate1,plate2,plate3;obj1=new Apple();obj2=new Pear();obj3=new Banana();plate1=new Plate();plate1.add(obj1);plate1.add(obj2);plate1.add(obj3);obj4=new Apple();obj5=new Banana();plate2=new Plate();plate3=new Plate();plate2.add(obj4);plate2.add(obj5);plate3.add(plate1);plate3.add(plate2);plate3.eat();}}课后习题二public abstract class AbstractFile {public abstract void add(Abstract );public abstract void delete(Abstract);public abstract void lookThrough();public abstract String get();}public class Image AbstractFile {private String ;public Image ) {this.;}public void add(Abstract) {}public void delete(Abstract) {}public void lookThrough() {}public String get() {return ;}}public class Text AbstractFile{private String ;public Text ) {this.;}public void add(Abstract) {}public void delete(Abstract) {}public void lookThrough() {}public String get() {return ;}}public class Vedio AbstractFile{private String ;public Vedio ) {this.;}public void add(Abstract) {}public void delete(Abstract) {}public void lookThrough() {}public String get() {return ;}}public class Folder extends AbstractFile{private ArrayList<AbstractFile> list=new ArrayList<AbstractFile>();private String ;public Folder(String ) {this.;}public void add(Abstract) {list.add(file);}public void delete(Abstract) {list.remove(file);}public void lookThrough() {System.out.println("正在浏览"+"文件夹,有以下文件");Iterator i=list.iterator();if(!(i.hasNext())){System.out.println("暂无任何文件");}for (Abstract : list) {System.out.println(abstract());}}public String get() {return ;}}测试类:public class Main {public static void main(String[] args) {// TODO Auto-generated method stubAbstract ImageFile("美女.jpg");Abstract VedioFile("xxx.avi");Abstract TextFile("凡人修仙传.txt");Abstract Folder("娱乐");folder.add(img1);folder.add(txt);folder.add(vedio);System.out.println("---------------------");folder.lookThrough();System.out.println("---------------------");folder.delete(txt);folder.delete(vedio);folder.delete(img1);System.out.println("---------------------");folder.lookThrough();}}装饰模式课后习题一抽象构建类:public interface Transform {public void move();}具体构建类:public class Car implements Transform {public Car() {System.out.println("变形金刚是一辆车");}public void move() {System.out.println("在陆地上移动");}}抽象装饰类:public class Changer implements Transform {private Transform transform;public Changer(Transform transform) {this.transform=transform;}public void move() {transform.move();}}具体装饰类:public class Doctor extends Robot {public Doctor(Transform transform) {super(transform);System.out.println("变成医生机器人");}public void cure(){System.out.println("我正在治疗");}}public class Robot extends Changer {public Robot(Transform transform) {super(transform);}public void say(){System.out.println("说话");}}public class Airplane extends Changer {public Airplane(Transform transform) {super(transform);System.out.println("变成飞机");}public void fly(){System.out.println("在空中飞翔");}}测试类:public class Test {public static void main(String[] args) {Transform transform;transform=new Car();Changer c=new Changer(transform);Robot r=new Robot(c);Doctor d=new Doctor(r);d.move();d.say();d.cure();}}课后习题二:抽象构建类:public interface AbstractBook {public void borrowBook();public void returnBook();}具体构建类:public class Book implements AbstractBook { public void borrowBook() {System.out.println("借书方法");}public void returnBook() {System.out.println("还书方法");}}抽象装饰类:public class AddFunction implements AbstractBook { private AbstractBook ab;public AddFunction(AbstractBook ab) {this.ab=ab;}public void borrowBook() {ab.borrowBook();}public void returnBook() {ab.returnBook();}}具体装饰类:public class AddFreeze extends AddFunction {public AddFreeze(AbstractBook ab) {super(ab);System.out.println("添加了冻结方法");}public void freeze(){System.out.println("冻结方法");}}public class AddLose extends AddFunction {public AddLose(AbstractBook ab) {super(ab);System.out.println("添加了遗失方法");}public void lose(){System.out.println("遗失方法");}}测试类:public class Test {public static void main(String[] args) {AbstractBook ab;ab=new Book();ab.borrowBook();ab.returnBook();System.out.println("--------");AddFreeze af=new AddFreeze(ab);af.borrowBook();af.returnBook();af.freeze();System.out.println("---------");AddLose al=new AddLose(ab);al.borrowBook();al.returnBook();al.lose();}}外观模式课后习题一:子系统类:public class {public void write(){System.out.println("文件正在保存。
