1、简单模式

2、工厂方法
类的定义看左边,运行看右边
意图!!!


3、抽象工厂


例题1:




4、生成器模式(不同的部件会产生不同的产品)
选择套餐1得产品A
选择套餐2得产品A+B
选择套餐3得产品A+B+C


抽象类不一定有抽象方法;有抽象方法的一定是抽象类
例题1:

(1)abstract void buildParts() (抽象方法,没有具体的实现,在子类中实现)

(2)this.pizzaBuilder=pizzaBuilder
(3)pizzaBuilder.buildParts() (相当于此时只是创建了披萨的模板,但是放什么东西还没确定)

(4)waiter.setPizzaBuilder(hawaiian_pizzabuilder) (将披萨设置为夏威夷披萨)
(5)waiter.construct() (创建这个夏威夷披萨的实体)
例题2:

(1)void buildPartA()
(2)Product getResult()

(3)product.setPartA
(4)product.setPartB

(5)builder.buildPartA()或者builder.buildPartB() (没有set所以不是get)
5、原型模式(clone为接口!)
强制转换:类与方法的返回值是否一致,不一致以类的为主
new一个对象时需要注意是否需要传参


例题一:

(1)implements
(2)WorkExperience obj=new WorkExperience() (与类class的返回类型保持一致!)

(3)implements
(4)(WorkExperience)work.Clone() (深拷贝!如果只写work别的地方修改之后原内容也修改了,这不符合实际!!!一定要注意括号中的类如果是题目别处定义过的,有可能要写定义的类的方法 并且要注意输出的类型,如果类中的方法返回类型和类的不同要将其强制转换为类的返回类型!!!)
(5)new Resume(this.work) (主要看类的返回类型!!!输入参数,如果所在类中有其余方法,这里可能要进行传参,传入的是非公有类型的参)

(6)(Resume)a.Clone() (切记强制类型转换!!!返回类型和类的类型不一致的时候,主要看类的类型!!!
6、适配器模式
java没有多重继承,这部分不看!!!


编译看左边,运行看右边:
在主程序中,当usb调用method时,如果USB类中并没有这个方法(主程序中第一行代码!!),直接报错(编译阶段)
在USB类中添加这个方法之后(无报错),实际运行生成结果输出Adapter,表示运行看右边Adapter类!

例题:


(1):Address address
(2):address.street() (没有输入参数的话,不用写this.参数)
(3):address.zip()
(4):address.city()

(5):DutchAddress addrAdapter=new DutchAddressAdapter(addr)
(定义初始化实例,有两种方法,一种是直接初始化定义,另一种是定义对象为父类的子类,多态的形式,只有这样才能实现适配器的作用,即运行看右边,展示的结果是address即适配后的结果!!!此外右边在定义适配器子类时是有参构造,因此要传参!)
在代码中没有任何一个类是没有用的!
7、桥接模式

相当于将产品分为类型和颜色两种,使用桥接将两者联系起来,两者之间可以随意搭配!类型变化和颜色是是没有任何关系的,反之亦然

例题一:


(1):this.imp
(2):ImageImp
(3):imp.doPaint(m)

(4)new BMP()
(5)new WinImp()
(6)image1.setImp(imageImp1)

1+n+1+m=n+m+2=10+5+2=17
(不采用桥接模式:1+n+n×m)
例题二:

(1):interface
(2):(public) void drawLine(double x1,double y1,double x2,double y2) (实现接口的时候,接口中的方法不用写abstract,本身就只写方法名就可以!)
(3):(public) void drawCircle(double x,double y,double r)

(4):DP1.draw_a_circle(x,y,r) (由于DP1中的方法是静态方法,因此可以直接通过 类名.方法进行调用)
(5):DP2.drawcircle(x,y,r)
(6):public abstract void draw()(因为是在类中所以如果是抽象的需要加abstract,此外除了看下面的共有方法之外,还可以看前面的图中,这个类中还缺一个方法!)
例题三:

(1):abstract void doPaint(Matrix m)


(2):imp.doPaint(m)
(3):new GIFImage()
(4):new LinuxImp()
(5):image.setImp(imageImp)
8、组合模式



例题一:

(1):abstract (有抽象方法的一定是抽象类!!!一般class前有空的,一般不写public这么简单,a小写!!!)
(2):null (对于文件来说以上文件都不需要储存,因此这个空返回空即可)

(3):List
(4):childList

以上Children均为children
根据以上代码可得如下文件排序:

(5):printTree(file) (如果结果是输出 c:\\ composite windos 这里填file.printName(),但是这里还有composite的子节点,因此需要进行递归调用!!!有参数的方法)
例题二:

(1):abstract class(注意是抽象类 abstract+class+类名)
(2):this.name

(3):Company(能存储子公司、办公室和部门的类)
(4):Company
(5):children
(6):children

(7):root.Add(comp)
(8):comp.Add(comp1)
例题三:

(1):abstract class
(2):public abstract void add(Menucomponent menucomponent)


(3):add(menuComponnent) (可以直接调用add方法进行添加!)
(4):menuComponent.print() (无参数的方法调用时)

(5):allMenus.print()
例题四:

(1):protected (一般都是受保护的)

(2):abstract boolean addMenuElement(MenuComponent element)
(3):abstract List<MenuComponent> getElement()

(4):List<MenuComponent> elementList

(5):mainMenu.addMenuElement(subMenu)
9、装饰器模式
顾名思义就是要给本来普通的东西添加一些"东西"



例题一:

(1):abstract
(2):String getDescription(从摩卡和奶泡的第三个方法中就可以看出beverage中存在一个getDescription方法,由此可得!!!)
(3):abstract int cost()
(4):protected Beverage beverage (在被继承的子类中,并没有定义beverage,因此只能在父类中定义,一般为受保护型)


(5):beverage (实例化的对象就是原先的对象!)
(6):beverage
例题二:

(1):ticket.printInvoice()

(2):super.printInvoice (调用父类的print方法,用于防止空指针异常!)
(3):super.printInvoice

(4):new FootDecorator(new HeadDecorator (t))
(5):new FootDecorator(new HeadDecorator(null)) (中间目录为空,因此传入的值为空,只输出抬头+尾注,且两个方法可以互换,结果不影响!)
10、享元模式


类似于下五子棋:没用这个模式之前,每下一个棋子都需要创建一个对象,会造成大量的开销,使用这个模式之后,外部状态为位置,只剩下颜色:白、黑。每次调用传入棋子位置即可,从一开始多个对象变成两个对象即可。

例题:

(1):public abstract void draw()


(2):Piece
(3):Piece
(4):piece.draw()
(5):piece.draw()
11、命令模式



例题一:

(1):interface
(2):light.on()
(3):light.off()

(4):onCommands[slot]
(5):offCommands[slot]
(6):onCommands[slot].execute()
(7):offCommands[slot].execute()

12、观察者模式
类似于B站,一个人关注多个up主



例题一:


(1):Subject
(2):observer.update(temperature,humidity,cleanness)
(3):notifyObserbers()
(4):measurementsChanged()

(5):Observer
(6):envData.registerObserver(this) (需要先注册才行,虽然方法中并没有定义observer类,但本身这个类就实现了Observer接口,因此,传入的参数直接是this即可!)

例题二:

(1):void update()

(2):Observer
(3):obs.update() (显示的时候都是先for循环赋值,之后对数据进行更新)
(4):Subject
(5):Attach(this) (添加/注册观察者在列表中!!!)
13、状态模式
可以从一个状态转化到另一个状态!


例题一:


(1):State (代码中自定义的类可以不写修饰符)

(2):tissueMachine.getHasQuarterState() (先得到相应值之后设置!使用题目中给出的get方法去得到相应值;第二种方法是new一个对象去进行实例化)
(3):tissueMachine.getNoQuarterState()

(4):tissueMachine.getNoQuarterState() (从类图中可得这个方法的下一个状态就是没有纸币状态)
(5):tissueMachine.getSoldOutState()
例题二:

(1):abstract double travel(int miles,CFrequentFlyer context)

(2):context.setState(new CSilver())
(3):context.setState(new CGold())

(4):context.setState(new CSilver())
(5):context.setState(new CBasic())
14、策略模式
例如:付款方式有现金、微信、支付宝等形式,他们就是下图中的ConcreteStrategy x的形式,可以相互替换!!!


例题一:



(1):FlyBehavior flyBehavior (可以去查看类图中的定义,左为对象名,右为类名)
(2):TakeOffBehavior takeOffBehavior
(3):flyBehavior.fly()
(4):takeOffBehavior.takeOff()
(5):extends (继承的符号!!!implements是接口的符号!!!)
(6):SubSonicFly()
(7):VerticalTakeOff()
例题二:

(1):double acceptCash(double money)

(2):cs=new CashNormal() (上边只是定义了cs的类型(cs的类型是接口),并没有实例化!!!这里需要实例化为类)
(3):cs=new CashDiscount(0.8)
(4):cs=new CashReturn(300,100)
(5):return cs.acceptCash(money)
例题三:

(1):void stop()

(2):BrakeBehavior
(3):wheel.stop() (可调用所在类的方法)
(4):wheel=behavior (构造函数一般多为tjis.name=name的格式,因此这里的构造函数也应该是赋值的形式!)
(5):brake()
15、访问者模式





例题一:

(1):void visit(Book p_book)
(2):void visit(Article p_article)

(3):void accept(LibraryVisitor visitor) (接口一般定义的是行为!!!)
(4):visitor.visit(this) (显示的是自己当前的类)

(5):visitor.visit(this)
16、中介者模式


例题:


(1):void buy(double money,WebService service)

(2):WebServiceMediator
(3):abstract void buyService(double money)
(4):mediator.buy(money,this) (定义了这个中介者,在整个代码中是一定会用到的!!!)


(5):mediator.buy(money,this)

以上就是软件设计师试题六的所有类型,需要谨记!