列出几种软件开发中常见的设计模式并解释
设计模式主要分三个类型:创建型、结构型和行为型。
其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个 *** 作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的 *** 作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的 *** 作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新 *** 作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,faade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。
二十三、Flyweight,享元模式
23种设计模式要在这里详细的都说一遍内容实在太多了啊,推荐你一本好书《软件秘笈:设计模式那点事》,里面讲解的23中设计模式例子很生动,容易理解,还有JDK中设计模式应用情况,看了收获挺大的!百度里面搜“设计模式”,第一条中设计模式百度百科中就有首推该图书,浏览量在20几万以上的,不会错的。
祝你早日学会设计模式!
软件设计师 uml分析与设计中常见的设计模式有哪几种常用的设计模式有10多种,你可以参考trufun UML2建模工具,有详细的每一种设计模式的支持,可以直接生成设计模式的相关类图。官网上有工具免费下载使用。
请说出几种软件开发时的设计模式(面试题)策略模式
代理模式
抽象工厂模式
代理模式之动态代理
单态模式和简单工厂模式
工厂方法模式
建造模式
门面模式
设计模式是软件开发中一种常用的方法吗
是的,设计模式可以极大的减轻代码的工作量,增加代码的可维护性、可复用性、灵活性、可扩展性
有哪些在游戏开发中常用到的设计模式MVC
这个是JAVA ee中就经常用到的模式
将数据模型、界面视图和业务逻辑控制分开的模式
在Android开发中体现的最明显
数据模型一定单独
界面视图在布局中实现
业务控制单独编写,典型的MVC
不要可以强调设计模式,设计模式也不是万能的,代码写多了你就了解了。不要刻意追求用设计模式,选择合适的方式才是最好的。设计模式也有缺陷,也不是完美的,不要被设计模式所束缚思维。
游戏中常用的设计模式:工厂、单例、代理、观察者、策略、状态
方便修改!如果你要我回答你这个问题 我会首先问你一个问题 你的编程基础有多少?
熟悉或接触过哪些OO语言 java C
对面向对象基础知识理解有多少了 封装 继承 多态等知道多少 它们的通俗意义和根本意义是什么
最后建议你去学习一下设计模式,深层次的东就是为了组织源码,建议直接上 《大话设计模式》 《head first设计模式》 《设计模式之禅》 三本,如果没基础,建议先看《大话设计模式》
最后!
上面已经问过你了 你是否有java c基础 如果有,OO思想必定有所提高!,只要你耐心啃得下来,设计模式是一种学习面向对象编程的很好的工具,23种设计模式只是学习的基础,更重要的是有这个知识后,去看第三方的开源框架的源码
如pureMVC WeeMVC之类,使用设计模式的知识去理解别人整个框架的架构 从中学习面向对象深层的知识
面向对象表层无非就是封装对象
erp软件开发用什么设计模式比较好观辰ERP采用C++ 语言 、SQL数据库 构建而成,以自主研发的智能平台为核心技术,已形成自主知识产权、独家、完整、成熟的平台产品及技术体系,为各行业企业提供快捷灵活、随需应变的信息化定制解决方案。
Android中常用的几种设计模式一单例模式,二建造者模式,三观察者模式 Observer(观察者),Observable(被观察者)四工厂者模式:Factory
当然代理模式中,用的最广泛的,用的最多的是 动态代理模式。
动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理。
抽象接口的类图如下:
--图来自设计模式之禅
所以动态代理模式要有一个InvocationHandler接口 和 GamePlayerIH实现类。其中 InvocationHandler是JD提供的动态代理接口,对被代理类的方法进行代理。
代码实现如下
抽象主题类或者接口:
复制代码
1 package comyemaoziproxydynamic;
2
3 /
4 动态代理:就是实现阶段不用关系代理是哪个,而在运行阶段指定具体哪个代理。
5 /
6 public interface IGamePlayer {
7 //登录游戏
8 public void login(String username, String password);
9
10 //击杀Boss
11 public void killBoss();
12
13 //升级
14 public void upGrade();
15 }
复制代码
需要被代理类:
复制代码
1 package comyemaoziproxydynamic;
2
3 public class GamePlayer implements IGamePlayer {
4
5 private String name = "";
6
7 public GamePlayer(String name){
8 thisname = name;
9 }
10
11 public void login(String username, String password) {
12 Systemoutprintln("登录名为 "+username+" 进入游戏," + name + " 登录成功!");
13 }
14
15 public void killBoss() {
16 Systemoutprintln(thisname + " 击杀了Boss!");
17 }
18
19 public void upGrade() {
20 Systemoutprintln(thisname + "升级了!");
21 }
22
23 }
复制代码
动态代理处理器类:
复制代码
1 package comyemaoziproxydynamic;
2
3 import javalangreflectInvocationHandler;
4 import javalangreflectMethod;
5
6 public class GamePlayerInvocationHandler implements InvocationHandler{
7
8 //被代理的对象
9 private Object obj;
10
11 //将需要代理的实例通过处理器类的构造方法传递给代理。
12 public GamePlayerInvocationHandler(Object obj){
13 thisobj = obj;
14 }
15
16 public Object invoke(Object proxy, Method method, Object[] args)
17 throws Throwable {
18 Object result = null;
19 if("login"equalsIgnoreCase(methodgetName())){
20 //这个在主题方法不受任何影响的情况下,在主题方法前后添加新的功能,或者增强主题方法,
21 //从侧面切入从而达到扩展的效果的编程,就是面向切面编程(AOP Aspect Oriented Programming)。
22 //AOP并不是新技术,而是相对于面向对象编程的一种新的编程思想。在日志,事务,权限等方面使用较多。
23 Systemoutprintln("代理登录游戏!");
24 result = methodinvoke(thisobj, args);
25 return result;
26 }
27 result = methodinvoke(thisobj, args);
28 return result;
29 }
30
31 }
复制代码
由于代理是动态产生的,所以不需要再声明代理类。
动态代理场景类:
复制代码
package comyemaoziproxydynamic;
import javalangreflectInvocationHandler;
import javalangreflectProxy;
public class Client {
public static void main(String[] args) {
IGamePlayer gp = new GamePlayer("张三");
InvocationHandler gpHandler = new GamePlayerInvocationHandler(gp);
//获取真实主题类的ClassLoader
ClassLoader classLoader = gpgetClass()getClassLoader();
//动态产生一个代理者。
Class<>[] cls = new Class[]{IGamePlayerclass};
IGamePlayer proxyGp = (IGamePlayer) ProxynewProxyInstance(classLoader, cls, gpHandler);
proxyGplogin("zhangsan", "123456");
proxyGpkillBoss();
proxyGpupGrade();
}
}
执行结果:
代理登录游戏!
登录名为 zhangsan 进入游戏,张三 登录成功!
张三 击杀了Boss!
张三升级了!
//在此,我们没有创建代理类,但是确实有代理类帮我们完成事情。
复制代码
其中,在此代理模式中,不仅代理是动态产生的(即在运行的时候生成),而且还在代理的时候,也增加了一些处理。在此处增加的处理,其实就是另一种编程思想-----面向切面编程思想(AOP Aspect Oriented Programming)。
带有AOP的动态代理模式类图:
--图来自设计模式之禅
从上图中,可以看出有两个相对独立的模块(Subject和InvocationHandler)。动态代理实现代理的职责,业务逻辑Subject实现相关的逻辑功能,两者之间没有必然的相互耦合的关系。然而,通知Advice从另一个切面切入,最终在上层模块就是Client耦合,完成逻辑的封装。
代码清单如下
抽象主题或者接口:
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 public interface Subject {
4 public void doSomething(String str);
5 //可以多个逻辑处理方法。。。
6 }
复制代码
真实主题:
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 public class RealSubject implements Subject{
4
5 public void doSomething(String str) {
6 //do something
7 Systemoutprintln("do something" + str);
8 }
9
10 }
复制代码
通知接口:
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 //通知接口及定义、
4 public interface IAdvice {
5 public void exec();
6 }
复制代码
前置通知:
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 public class BeforeAdvice implements IAdvice {
4 //在被代理的方法前来执行,从而达到扩展功能。
5 public void exec() {
6 Systemoutprintln("前置通知被执行!");
7 }
8 }
复制代码
后置通知:
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 public class AfterAdvice implements IAdvice {
4
5 //在被代理的方法后来执行,从而达到扩展功能。
6 public void exec() {
7 Systemoutprintln("后置通知被执行!");
8 }
9 }
复制代码
动态代理的处理器类:
所有的方法通过invoke方法类实现。
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 import javalangreflectInvocationHandler;
4 import javalangreflectMethod;
5
6 public class MyInvocationHandler implements InvocationHandler {
7
8 //被代理的对象
9 private Subject realSubject;
10 //通过MyInvocationHandler的构造方法将被代理对象传递过来。
11 public MyInvocationHandler(Subject realSubject){
12 thisrealSubject = realSubject;
13 }
14 //执行被代理类的方法。
15 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
16 //在执行方法前,执行前置通知。
17 IAdvice beforeAdvice = new BeforeAdvice();
18 beforeAdviceexec();
19 Object result = methodinvoke(thisrealSubject, args);
20 //在执行方法后,执行后置通知。
21 IAdvice afterAdvice = new AfterAdvice();
22 afterAdviceexec();
23 //前置通知,和后置通知,都是要看具体实际的业务需求来进行添加。
24 return result;
25 }
26
27 }
复制代码
动态代理类:
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 import javalangreflectInvocationHandler;
4 import javalangreflectProxy;
5
6 public class DynamicProxy {
7
8 /
9 public static Object newProxyInstance(ClassLoader loader, Class<>[] interfaces,InvocationHandler handler)
10 loader:
11 一个ClassLoader对象,定义了由哪个ClassLoader对象,来对生产的代理进行加载。
12 interfaces:
13 一个Interfaces数组,表示我将要给我所代理的对象提供一组什么样的接口,
14 如果提供一组接口给它,那么该代理对象就宣称实现了该接口,从而可以调用接口中的方法。
15 即,查找出真是主题类的所实现的所有的接口。
16 handler:
17 一个InvocationHandler对象,表示当我这个动态代理对象在调用方法时,会关联到该InvocationHandler对象。
18 该InvocationHandler与主题类有着关联。
19 /
20 public static <T> T newProxyInstance(ClassLoader classLoader, Class<>[] interfaces, InvocationHandler handler){
21 @SuppressWarnings("unchecked")
22 T t = (T) ProxynewProxyInstance(classLoader, interfaces, handler);
23 return t;
24 }
25 }
复制代码
从动态的产生动态代理类。
动态代理场景类:
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 import javalangreflectInvocationHandler;
4
5 public class AOPClient {
6
7 public static void main(String[] args) {
8 Subject realSubject = new RealSubject();
9 InvocationHandler handler = new MyInvocationHandler(realSubject);
10 ClassLoader classLoader = realSubjectgetClass()getClassLoader();
11 Class<>[] interfaces = realSubjectgetClass()getInterfaces();
12 Subject proxySubect = DynamicProxynewProxyInstance(classLoader, interfaces, handler);
13 proxySubectdoSomething("这是一个Dynamic AOP示例!!!");
14 }
15 }
16
17 执行结果:
18 前置通知被执行!
19 do something这是一个Dynamic AOP示例!!!
20 后置通知被执行!
复制代码
动态代理中invoke的动态调用:
动态代理类DynamicProxy是个纯粹的动态创建代理类通用类。
所以在具体业务中,可以在进一步封装具体的具有业务逻辑意义的DynamicProxy类。
代码如下
具体业务的动态代理:
复制代码
1 package comyemaoziproxydynamic_aop;
2
3 import javalangreflectInvocationHandler;
4 //具体业务的动态代理。
5 public class SubjectDynamicProxy extends DynamicProxy {
6 public static <T> T newProxyInstance(Subject subject){
7 ClassLoader classLoader = subjectgetClass()getClassLoader();
8 Class<>[] interfaces = subjectgetClass()getInterfaces();
9 InvocationHandler handler = new MyInvocationHandler(subject);
10 T t = newProxyInstance(classLoader, interfaces, handler);
11 return t;
12 }
13 }
本人211工科专业的,学的是电子科学专业,对于软件设计还是上过几门相关课程的。所以,有一点自己的看法。我觉得对于初学者来说,一定要循序渐进,不能着急,一下的几本书可以入手看一看,拜读一下。
首先推荐《Head First设计模式》这本书,为啥首先推荐这本书呢,这本书就是页数多了一点,但是一点都不难懂。里面的讲解都是贴近生活的,很生动,并且都是有实际的例子,你看着书,能够在脑海里面想象出画面,看起来不会觉得太抽象。但是缺点除了太厚之外,就是不够高大上,缺少深入的东西,但是对于初学者还是足够了。
然后推荐《大话设计模式》这本书,这本书用的是C语言来写的,其中的很多概念讲解很好,而且很细致,如果你对概念的理解不好的话,我觉得你可以选择这本书,个人感觉(不一定对)。而且这本书没有别的软件设计的书那么枯燥,行文很幽默,你理解起来会好一点。
最后推荐《设计模式》这本书,这本书出来的比较新,不过这本书的定位就是作为设计模式的入门教材,加上清华大学出版社的金字招牌,质量还是非常有保障的。里面的好多的实际应用中的例子都很现实,可以很快的入门。所以,这本书还是值得一看的。
以上是我的回答,有其他的好的入门书推荐的话,欢迎补充。
以上就是关于列出几种软件开发中常见的设计模式并解释全部的内容,包括:列出几种软件开发中常见的设计模式并解释、一个程序问题,广大大牛们可不可以用动态代理模式实现(调用method方法后不结束main方法)、初学软件设计模式应该读哪本书等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)