zoukankan      html  css  js  c++  java
  • 设计模式相关面试题目

    设计模式理论

    1.什么是设计模式?你是否在你的代码里面使用过任何设计模式?
    在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。
    平时用的比较多有单例模式(在内存中仅实例化一个对象时使用),适配器模式(典型的就是ListView和GridView的适配器),建造者模式(AlertDialog.Builder),观察者模式可能比较隐蔽,在Android源码中BaseAdapater的NotifyDataSetChanged的实现(?)。

    2.你可以说出几个在JDK库中使用的设计模式吗?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    Birdge 桥接模式:
    这个模式将抽象和抽象操作的实现进行了解耦,这样使得抽象和实现可以独立地变化。
    GOF在提出桥梁模式的时候指出,桥梁模式的用意是"将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。这句话有三个关键词,也就是抽象化、实现化和脱耦。
    在Java应用中,对于桥接模式有一个非常典型的例子,就是应用程序使用JDBC驱动程序进行开发的方式。所谓驱动程序,指的是按照预先约定好的接口来操作计算机系统或者是外围设备的程序。
     
    Adapter 适配器模式:
    用来把一个接口转化成另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
    java.util.Arrays#asList()
    java.io.InputStreamReader(InputStream)
    java.io.OutputStreamWriter(OutputStream)
     
    Composite 组合模式:
    又叫做部分-整体模式,使得客户端看来单个对象和对象的组合是同等的。换句话说,某个类型的方法同时也接受自身类型作为参数。
    avax.swing.JComponent#add(Component)
    java.util.Map#putAll(Map)
    java.util.List#addAll(Collection)
    java.util.Set#addAll(Collection)
     
    装饰者模式:
    动态的给一个对象附加额外的功能,这也是子类的一种替代方式。可以看到,在创建一个类型的时候,同时也传入同一类型的对象。这在JDK里随处可见,你会发现它无处不在,所以下面这个列表只是一小部分。
    java.io.BufferedInputStream(InputStream)
    java.io.DataInputStream(InputStream)
    java.io.BufferedOutputStream(OutputStream)
    java.util.zip.ZipOutputStream(OutputStream)
    java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap
     
    Facade 门面模式,即外观模式:
    给一组组件,接口,抽象,或者子系统提供一个简单的接口。
    java.lang.Class
    javax.faces.webapp.FacesServlet
     
    Flyweight 享元模式:
    使用缓存来加速大量小对象的访问时间。
    java.lang.Integer#valueOf(int)
    java.lang.Boolean#valueOf(boolean)
    java.lang.Byte#valueOf(byte)
    java.lang.Character#valueOf(char)
     
    Proxy 代理模式:
    代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象。
    java.lang.reflect.Proxy
    RMI
     
    Abstract Factory 抽象工厂模式:
    抽象工厂模式提供了一个协议来生成一系列的相关或者独立的对象,而不用指定具体对象的类型。它使得应用程序能够和使用的框架的具体实现进行解耦。这在JDK或者许多框架比如Spring中都随处可见。它们也很容易识别,一个创建新对象的方法,返回的却是接口或者抽象类的,就是抽象工厂模式了。
    java.util.Calendar#getInstance()
    java.util.Arrays#asList()
    java.util.ResourceBundle#getBundle()
    java.sql.DriverManager#getConnection()
    java.sql.Connection#createStatement()
    java.sql.Statement#executeQuery()
    java.text.NumberFormat#getInstance()
    javax.xml.transform.TransformerFactory#newInstance()
     
     
    抽象工厂模式
    抽象工厂模式提供了一个协议来生成一系列的相关或者独立的对象,而不用指定具体对象的类型。它使得应用程序能够和使用的框架的具体实现进行解耦。这在JDK或者许多框架比如Spring中都随处可见。它们也很容易识别,一个创建新对象的方法,返回的却是接口或者抽象类的,就是抽象工厂模式了。
    java.util.Calendar#getInstance()
    java.util.Arrays#asList()
    java.util.ResourceBundle#getBundle()
    java.sql.DriverManager#getConnection()
    java.sql.Connection#createStatement()
    java.sql.Statement#executeQuery()
    java.text.NumberFormat#getInstance()
    javax.xml.transform.TransformerFactory#newInstance()
     
    Builder 建造者模式:
    定义了一个新的类来构建另一个类的实例,以简化复杂对象的创建。建造模式通常也使用方法链接来实现。
    java.lang.StringBuilder#append()
    java.lang.StringBuffer#append()
    java.sql.PreparedStatement
    javax.swing.GroupLayout.Group#addComponent()
     
    工厂方法:
    就是一个返回具体对象的方法。
    java.lang.Proxy#newProxyInstance()
    java.lang.Object#toString()
    java.lang.Class#newInstance()
    java.lang.reflect.Array#newInstance()
    java.lang.reflect.Constructor#newInstance()
    java.lang.Boolean#valueOf(String)
    java.lang.Class#forName()
     
    原型模式
    使得类的实例能够生成自身的拷贝。如果创建一个对象的实例非常复杂且耗时时,就可以使用这种模式,而不重新创建一个新的实例,你可以拷贝一个对象并直接修改它。
    java.lang.Object#clone()
    java.lang.Cloneable
     
    单例模式
    用来确保类只有一个实例。Joshua Bloch在Effetive Java中建议到,还有一种方法就是使用枚举。
    java.lang.Runtime#getRuntime()
    java.awt.Toolkit#getDefaultToolkit()
    java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
    java.awt.Desktop#getDesktop()
     
     
    责任链模式
    通过把请求从一个对象传递到链条中下一个对象的方式,直到请求被处理完毕,以实现对象间的解耦。
     
    java.util.logging.Logger#log()
    javax.servlet.Filter#doFilter()
    命令模式
    将操作封装到对象内,以便存储,传递和返回。
     
    java.lang.Runnable
    javax.swing.Action
    解释器模式
    这个模式通常定义了一个语言的语法,然后解析相应语法的语句。
     
    java.util.Pattern
    java.text.Normalizer
    java.text.Format
    迭代器模式
    提供一个一致的方法来顺序访问集合中的对象,这个方法与底层的集合的具体实现无关。
     
    java.util.Iterator
    java.util.Enumeration
    中介者模式
    通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖。
     
    java.util.Timer
    java.util.concurrent.Executor#execute()
    java.util.concurrent.ExecutorService#submit()
    java.lang.reflect.Method#invoke()
    备忘录模式
    生成对象状态的一个快照,以便对象可以恢复原始状态而不用暴露自身的内容。Date对象通过自身内部的一个long值来实现备忘录模式。
     
    java.util.Date
    java.io.Serializable
    空对象模式
    这个模式通过一个无意义的对象来代替没有对象这个状态。它使得你不用额外对空对象进行处理。
     
    java.util.Collections#emptyList()
    java.util.Collections#emptyMap()
    java.util.Collections#emptySet()
    观察者模式
    它使得一个对象可以灵活的将消息发送给感兴趣的对象。
     
    java.util.EventListener
    javax.servlet.http.HttpSessionBindingListener
    javax.servlet.http.HttpSessionAttributeListener
    javax.faces.event.PhaseListener
    状态模式
    通过改变对象内部的状态,使得你可以在运行时动态改变一个对象的行为。
     
    java.util.Iterator
    javax.faces.lifecycle.LifeCycle#execute()
    策略模式
    使用这个模式来将一组算法封装成一系列对象。通过传递这些对象可以灵活的改变程序的功能。
     
    java.util.Comparator#compare()
    javax.servlet.http.HttpServlet
    javax.servlet.Filter#doFilter()
    模板方法模式
    让子类可以重写方法的一部分,而不是整个重写,你可以控制子类需要重写那些操作。
     
    java.util.Collections#sort()
    java.io.InputStream#skip()
    java.io.InputStream#read()
    java.util.AbstractList#indexOf()
    访问者模式
    提供一个方便的可维护的方式来操作一组对象。它使得你在不改变操作的对象前提下,可以修改或者扩展对象的行为。
     
    javax.lang.model.element.Element and javax.lang.model.element.ElementVisitor
    javax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor

      

    3.Java中什么是单例设计模式?用Java写出线程安全的单例。
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
    使用单例模式最核心的一点是体现了面向对象封装特性中的“单一职责”和“对象自治”原则。
    并且可以节省系统开销。

    4.使用工厂模式最主要的好处是什么?你在哪里使用?
    各模式的理解: 
    简单工厂:把对象的创建放到一个工厂类中,通过参数来创建不同的对象。 
    工厂方法:每种产品由一种工厂来创建。(不这样会有什么问题?) 
    抽象工厂:子工厂有一些相同的功能,将这些功能抽象放在父工厂中,每个子工厂有这些公共行为,还有自己的功能。

    面向接口编程:设计模式的一个重要原则是 针对接口编程,不要依赖实现类。工厂模式遵循了这一个原则。 
    开闭原则(Open-Closed Principle,OCP) “Software entities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。这句话说得略微有点专业,我们把它讲得更通俗一点,也就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。

    使用工厂的理由: 使开发者和对象的创建隔离开来。同时不在关心对象创建的细节
    A.把对象的创建集中在一个地方(工厂中),在增加新的对象类型的时候,只需要改变工厂方法;否则在应用中四处散布对象创建逻辑,如果创建方法改变时则需要四处修改,维护量增加. 
    B.应用的场合是新的对象类型很可能经常被添加进来. 
    C.你所关心的仅仅是工厂方法返回的接口方法,不必关心实现细节

    5.在Java中,什么叫观察者设计模式(observer design pattern)?
    观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
    一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作。

    6.举一个用Java实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类层次?
    动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系。在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能。
    装饰原有对象、在不改变原有对象的情况下扩展增强新功能/新特征.。当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式。

    7.什么是MVC设计模式?举一个MVC设计模式的例子?
    MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。

    参考:https://yq.aliyun.com/articles/38175

  • 相关阅读:
    枚举Android系统的进程,任务和服务的信息
    android Gallery可循环显示图片
    android获取正在运行的进程
    Android Textview控件
    android中使用代码混淆出现Conversion to Dalvik format failed with error 1错误的解决办法
    Android断点续传
    vim常用快捷键
    V型开发过程
    CentOS 5.5 中文乱码问题解决方案
    使用yum来安装或卸载CentOS图形界面包 [linux技术]
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8832589.html
Copyright © 2011-2022 走看看