`
terry_yip
  • 浏览: 38778 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

求一种合适的设计模式解决这个问题

阅读更多
求一种合适的设计模式解决这个问题


      
 public String onDelete(Object obj)
	{
		// TODO Auto-generated method stub
		String result="JOBTITLE_DELETE_SUCC";
		log.info("**********deleting*************");
		try
		{ 
		  Object vo=clientDataMap.get("DELETE_OBJECT");
		 
                   if(!BACKUP.equals("1"))
                   {  
                       SpringDao.delete(vo);
                   }
                   else
                   {  
		     SpringBakDao.delete(vo, new String[]{user,actionType,projectUtils.getVOId(vo)});
	           }
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
			result="JOBTITLE_DELETE_FAIL";
		}
		return result;
	}

	public String onInsert(Object obj)
	{   
		String result=module+"_INSERT_SUCC";;
		try
		{ 
		  Object vo=clientDataMap.get("VO");
		  if(!BACKUP.equals("1"))
                        SpringDao.insert(vo);
		  else
			SpringBakDao.insert(vo, new String[]{"Terry",actionType});
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
			result=module+"_INSERT_FAIL";
		}
		log.info("GeneralPersistBO...INSERT()...result:"+result);
		return result;
	}


这是一个进行持久化事务的类,这里有两个DAO分属于不同类型,SpringDao只往一个数据库中存数据,SpringBakDao会往备份数据库中存数据,BACKUP常量控制是哪种持久化方式,问题是,每次crud操作时,
都对BACKUP判断一次, 实在是有冗余代码,不是一个良好的设计,我想到几个方案:

1 使 SpringDao和SpringBakDao都实现一个IDAO接口,但问题是,这两个DAO的crud方法,都是需传入不同的参数个数的,如果想统一起来,可以写一个Adapter,然后实现所有接口方法,再每个Dao继承这个Adapter并重载相关的方法,但是,由于要传入的参数个数不同, 始终要判断BACKUP的值


2 用proxy或interceptor, 都存在一个难点,不同DAO的相同的crud方法的参数都不一样的,就算同一个DAO类型的crud四个方法的参数个数也不一致,例如
SpringBakDao.delete(vo,new String[]{String id}),SpringBak.insert(vo,new String[]{String id,String newId}); 如果我用proxy模式,岂不是要传入最多的参数个数入这个proxy类里面,才能应付所有情况?

两种方案都不是理想的,所以想听听大家的意见,有什么更好的模式可以解决这个问题.谢谢
分享到:
评论
19 楼 jellyfish 2007-03-16  
backup is part of the persistent strategy, so it should be hidden under the DAO as well, this means in the business object, there is only one DAO for this. Again decorate the normal persistence with another backup function.

Shielding out the persistence doesn't make much difference for smaller, stable projects(which are the idea playground that RoR folks are battling on), but it makes big difference in complex or large projects where new functionalities are added almost daily. Though due to heavy impact on performance DAO shows more in discussions, this is not the only component, other services, especially distributed services, can also make big impact as well.

My word was harsh because I felt this was not in the right direction. I raised a bright red flag to say, hey, that's not the direction you want to go(do I sound like a dictator? :-)).

18 楼 jellyfish 2007-03-16  
wyork 写道
terry_yip 写道
谢谢上面的各位, 综合来说,我还是认同jerryfish的观点, 用decorator来解决这个问题, 虽然他的言语有点激动.


能不能翻译一下?

he tend to agree with jellyfish(not jerryfish, it's the stinky jellyfish, my daughter's favorite, :-)) saying, though jellyfish is nowhere close to be gentle.
17 楼 zrq 2007-03-16  
The purpose of the code is to backup the data in another database if the flag is true.

The solution itself is not correct if there are some buik deletion and bulk update, while only trigger could be used to track the data changes.

If your case doesn't have any bulk update and bulk deletion.The backup dao and regular dao should implement the same interface. In the business logic, get the dao from DaoFactory, in which you can decide which dao should be returned,and after that you you should be able to any update/delete.

If the backupDAO does need more paramters that the regular dao ,while in normal cases it should not, the extra parameters could be passed in as the parameter when retrieving the dao from daofactory, where the parater could be ingored if the returned dao is regular dao.

Here is the psudo code to simplify your code.


//you business object;
  IDAO dao=Daofactory.getDAO(user,actionType);
  dao.onDelete(vo);
 

class Daofactory{
   public static IDAO getDAO(User user,String actionType){
   IDAO dao=null;
    if(!BACKUP.equals("1")) {
      dao=new RegularDAO();
    }else{
      dao=new BackDAO( user, actionType);
    }
    return dao;
   }

}

interface IDAO {
public onDelete(Object vo);
public onUpdate(Object vo);
}

public class BackDAO implements  IDAO{

private User user;
private String actionType;


public BackDAO(User user,String actionType){
this.user=user;
this.actionType=actionType;
}

public onDelete(Object vo){
//TODO: your own  backup logic
}
public onUpdate(Object vo){
//TODO: your own backup logic;
}

}



public class RegularDAO implements  IDAO{



public onDelete(Object vo){
//TODO: your own  backup logic
}
public onUpdate(Object vo){
//TODO: your own backup logic;
}
}



16 楼 wyork 2007-03-14  
terry_yip 写道
谢谢上面的各位, 综合来说,我还是认同jerryfish的观点, 用decorator来解决这个问题, 虽然他的言语有点激动.


能不能翻译一下?
15 楼 terry_yip 2007-03-14  
谢谢上面的各位, 综合来说,我还是认同jerryfish的观点, 用decorator来解决这个问题, 虽然他的言语有点激动.

14 楼 redhat 2007-03-14  
just think about the context!

jellyfish,get the point firstly!

don't consider contest,problem,and solution seperately!

just get the point!don't be distracted by the code.

think encapsulation over,don't say never.
"never pass Object" !
think about PO carefully!

when you use patterns,don't do it like that. 
13 楼 wyork 2007-03-14  
这个帖子对你有帮助
http://www.iteye.com/post/236928
12 楼 wyork 2007-03-13  
在初始化的时候定义Dao呢?

public class class_name {

//Object可以是SpringDao和SpringBakDao的接口
private Object dao = new Object();
public class_name(){    
    if(!BACKUP.equals("1"))   
    {     
        dao = new SpringDao();   
    }   
    else  
    {     
        dao = new SpringBakDao();   
    }   

}
public String onDelete(Object obj)   
{   
    // TODO Auto-generated method stub   
    String result="JOBTITLE_DELETE_SUCC";   
    log.info("**********deleting*************");   
    try  
    {    
      Object vo=clientDataMap.get("DELETE_OBJECT");   
      dao.delete(vo);   
    }   
    catch(Exception ex)   
    {   
        ex.printStackTrace();   
        result="JOBTITLE_DELETE_FAIL";   
    }   
    return result;   
}   
  
public String onInsert(Object obj)   
{      
    String result=module+"_INSERT_SUCC";;   
    try  
    {    
      Object vo=clientDataMap.get("VO");   
      dao.insert(vo);   
    }   
    catch(Exception ex)   
    {   
        ex.printStackTrace();   
        result=module+"_INSERT_FAIL";   
    }   
    log.info("GeneralPersistBO...INSERT()...result:"+result);   
    return result;   
}
}  
11 楼 qinysong 2007-03-13  
jellyfish说的很好
10 楼 jellyfish 2007-03-13  
too many problems, nothing is right, a piece of junk.

1. never pass Object type on the DAO interface. DAO interface is part of domain, you should use strong typed classes from your domain.
2. DAO serves the purpose of persistence, and thus the DAO interface should be designed independent of underlying persistence, be database, file, etc. So you should really consider hard *what* you want to persist and pass that in.
3. Proxy pattern is totally irrelevent. Interceptor is not right either. The correct pattern is the Decorator. What pattern to use is determined by your purpose, not behavior. Your purpose is to shield out the persistent complexity from the caller of the DAO interface, not you want vary the implementation(not proxy), and maintain the same interface(not interceptor). AOP is equiv~ to the Decorator(i.e., maintain the DAO interface).

Fix the DAO interface first, then use decorator.
Think about the DAO interface if you need to save the data to a file, a db, an excel table, then you can abstract something out.

Think about decorator to add a backup logic, a cache, a permission check, etc. Then you can separate different responsibilities.

My word may be harsh, not to you, but to the code. You have to see through the details to get the bottom. Abstraction is the golden rule.

Cheers.
9 楼 redhat 2007-03-12  
Class
DeleteData // data to del
BakDeleteData //extends DeleteData to del as bak data
DataOperator //to operate data fuction/action
DeleteImpInterface //interface to perform delete action
DeleteBak //implements DeleteImpInterface to del bakeup database's data
DeleteNormally //implements DeleteImpInterface to del normal database's data

Test to test the function;

public class DeleteData
{
    protected Object vo;

    public DeleteData(Object obj)
    {
        this.vo = obj;
    }

    public Object getVo()
    {
        return vo;
    }

    public void setVo(Object vo)
    {
        this.vo = vo;
    }
}

{
    private String[] extParams;

    public BakDeleteData(Object obj){
        super(obj);
    }

    public void setExtParams(String[] extParams)
    {
        this.extParams = extParams;
    }

    public String[] getExtParams()
    {
        return extParams;
    }
}


public class DataOperator
{
    private static Logger log = Logger.getLogger("data/operator");
    private DeleteImpInterface deletor;

     public DataOperator( )
    {
    }
    public DataOperator(DeleteImpInterface deletor)
    {
        this.deletor = deletor;
    }

    public void setDeletor(DeleteImpInterface deletor)
    {
        this.deletor = deletor;
    }

    public DeleteImpInterface getDeletor()
    {
        return deletor;
    }

    public String onDelete(DeleteData obj)
    {
        // TODO Auto-generated method stub
        String result = "JOBTITLE_DELETE_SUCC";
        log.info("**********deleting*************");
        try {
//              Object vo=clientDataMap.get("DELETE_OBJECT");
//                   deldata=new DeleteData(obj);
            deletor.delete(obj);

//                 SpringBakDao.delete(vo, new String[]{user,actionType,projectUtils.getVOId(vo)});

        }
        catch (Exception ex) {
            ex.printStackTrace();
            result = "JOBTITLE_DELETE_FAIL";
        }
        return result;
    }
}


public interface DeleteImpInterface
{
    public void delete(DeleteData d) throws Exception;
}


public class DeleteBak implements DeleteImpInterface
{
    public void delete(BakDeleteData d)
    {
        SpringDao.delete(d.getVo(), d.getExtParams());//use SpringDao to imp,you must define this first.
    }

public class DeleteNormally implements DeleteImpInterface
{
    public void delete(DeleteData d)
    {
        SpringDao.delete(d.getVo());());//use SpringDao to imp,you must define this first.

    }
}
}

public class Test
{
    public static void main(String[] args)
    {
        //get po
        Object vo1 = new Object();//or get po by vo; use SpringDao.getPo(vo) or someone else;
        Object vo2 = new Object();//or get po by vo; use SpringDao.getPo(vo) or someone else;

        //get deleted data
        DeleteData delData1 = new DeleteData(vo1);
        BakDeleteData delData2 = new BakDeleteData(vo2);
        delData2.setExtParams(new String[]{"sss", "ddddd"});

        DataOperator operator = new DataOperator();

        //del normal database's data
        operator.setDeletor(new DeleteNormally());
        operator.onDelete(delData1);

        //del bakeup database's data
        operator.setDeletor(new DeleteBak());
        operator.onDelete(delData2);
        //http://www.iteye.com/topic/59239
    }
}


of course it is not perfect one for our purpose,
but yoou know ,there is no perfect one but the best! try for it,perhaps it is not very well!just try it.

firstly I just want to say that don't use too much params to pass to methods,encapsulate the for the best;we can modify them easily when params increased or decreased
secondly, use strategy or bridge.but you must know that,strategy is not the perfect one.maybe someone else
thirdly, use polymorphism to avoid if/else, that is an effective way.
have fun!
8 楼 xly_971223 2007-03-12  
<br/>
<strong>badqiu 写道:</strong><br/>
<div class='quote_div'>
<p>使用Template Method</p>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
    <li class='alt'><span><span class='keyword'>public</span><span> String onDelete(Object obj)      </span></span> </li>
    <li class=''><span>{      </span> </li>
    <li class='alt'><span>    </span><span class='comment'>// TODO Auto-generated method stub    </span><span>  </span> </li>
    <li class=''><span>    String result=</span><span class='string'>"JOBTITLE_DELETE_SUCC"</span><span>;      </span> </li>
    <li class='alt'><span>    log.info(</span><span class='string'>"**********deleting*************"</span><span>);      </span> </li>
    <li class=''><span>    </span><span class='keyword'>try</span><span>     </span> </li>
    <li class='alt'><span>    {       </span> </li>
    <li class=''><span>      Object vo=clientDataMap.get(</span><span class='string'>"DELETE_OBJECT"</span><span>);      </span> </li>
    <li class='alt'><span>           </span> </li>
    <li class=''><span>                  </span><span class='keyword'>if</span><span>(!BACKUP.equals(</span><span class='string'>"1"</span><span>))      </span> </li>
    <li class='alt'><span>                  {        </span> </li>
    <li class=''><span>                      delete(vo);      </span> </li>
    <li class='alt'><span>                  }      </span> </li>
    <li class=''><span>                  </span><span class='keyword'>else</span><span>     </span> </li>
    <li class='alt'><span>                  {        </span> </li>
    <li class=''><span>                  delete(vo, </span><span class='keyword'>new</span><span> String[]{user,actionType,projectUtils.getVOId(vo)});      </span> </li>
    <li class='alt'><span>           }      </span> </li>
    <li class=''><span>    }      </span> </li>
    <li class='alt'><span>    </span><span class='keyword'>catch</span><span>(Exception ex)      </span> </li>
    <li class=''><span>    {      </span> </li>
    <li class='alt'><span>        ex.printStackTrace();      </span> </li>
    <li class=''><span>        result=</span><span class='string'>"JOBTITLE_DELETE_FAIL"</span><span>;      </span> </li>
    <li class='alt'><span>    }      </span> </li>
    <li class=''><span>    </span><span class='keyword'>return</span><span> result;      </span> </li>
    <li class='alt'><span>}      </span> </li>
    <li class=''><span>  </span> </li>
    <li class='alt'><span/><span class='keyword'>protected</span><span>  </span><span class='keyword'>void</span><span> delete(Object vo) {}   </span> </li>
    <li class=''><span/><span class='keyword'>protected</span><span> </span><span class='keyword'>void</span><span> delete(Object vo,String[] args){};   </span> </li>
    <li class='alt'><span>  </span> </li>
    <li class=''><span/><span class='keyword'>public</span><span> String onInsert(Object obj)      </span> </li>
    <li class='alt'><span>{         </span> </li>
    <li class=''><span>    String result=module+</span><span class='string'>"_INSERT_SUCC"</span><span>;;      </span> </li>
    <li class='alt'><span>    </span><span class='keyword'>try</span><span>     </span> </li>
    <li class=''><span>    {       </span> </li>
    <li class='alt'><span>      Object vo=clientDataMap.get(</span><span class='string'>"VO"</span><span>);      </span> </li>
    <li class=''><span>      </span><span class='keyword'>if</span><span>(!BACKUP.equals(</span><span class='string'>"1"</span><span>))      </span> </li>
    <li class='alt'><span>                       insert(vo);      </span> </li>
    <li class=''><span>      </span><span class='keyword'>else</span><span>     </span> </li>
    <li class='alt'><span>        insert(vo, </span><span class='keyword'>new</span><span> String[]{</span><span class='string'>"Terry"</span><span>,actionType});      </span> </li>
    <li class=''><span>    }      </span> </li>
    <li class='alt'><span>    </span><span class='keyword'>catch</span><span>(Exception ex)      </span> </li>
    <li class=''><span>    {      </span> </li>
    <li class='alt'><span>        ex.printStackTrace();      </span> </li>
    <li class=''><span>        result=module+</span><span class='string'>"_INSERT_FAIL"</span><span>;      </span> </li>
    <li class='alt'><span>    }      </span> </li>
    <li class=''><span>    log.info(</span><span class='string'>"GeneralPersistBO...INSERT()...result:"</span><span>+result);      </span> </li>
    <li class='alt'><span>    </span><span class='keyword'>return</span><span> result;      </span> </li>
    <li class=''><span>}     </span> </li>
    <li class='alt'><span>  </span> </li>
    <li class=''><span/><span class='keyword'>protected</span><span>  </span><span class='keyword'>void</span><span> insert(Object vo) {}   </span> </li>
    <li class='alt'><span/><span class='keyword'>protected</span><span> </span><span class='keyword'>void</span><span> insert(Object vo,String[] args){};  </span> </li>
</ol>
</div>
</div>
<p><br/>
<br/>
模版方法是 不能解决重复代码的 。想象一下 如果有10个onXXX()方法都带有</p>
<p><span class='keyword'>if</span><span>(!BACKUP.equals(</span><span class='string'>"1"</span><span>))   </span> </p>
<li class='alt'><span>                  {     </span></li>
<li class=''><span>                      SpringDao.delete(vo);   </span></li>
<li class='alt'><span>                  }   </span></li>
<li class=''><span>                  </span><span class='keyword'>else</span><span>  </span></li>
<li class='alt'><span>                  {     </span></li>
<li class=''><span>         SpringBakDao.delete(vo, </span><span class='keyword'>new</span><span> String[]{user,actionType,projectUtils.getVOId(vo)});   </span></li>
<li class=''><span>}</span></li>
<p>是不是很白痴 而且如果需求有改变,需要加一个else if ,难道要修改这10个方法吗?<br/>
<br/>
</p>
7 楼 badqiu 2007-03-12  
<p>使用Template Method</p>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'/>
<ol class='dp-j'>
    <li class='alt'><span><span class='keyword'>public</span><span> String onDelete(Object obj)      </span></span></li>
    <li class=''><span>{      </span></li>
    <li class='alt'><span>    </span><span class='comment'>// TODO Auto-generated method stub    </span><span>  </span></li>
    <li class=''><span>    String result=</span><span class='string'>"JOBTITLE_DELETE_SUCC"</span><span>;      </span></li>
    <li class='alt'><span>    log.info(</span><span class='string'>"**********deleting*************"</span><span>);      </span></li>
    <li class=''><span>    </span><span class='keyword'>try</span><span>     </span></li>
    <li class='alt'><span>    {       </span></li>
    <li class=''><span>      Object vo=clientDataMap.get(</span><span class='string'>"DELETE_OBJECT"</span><span>);      </span></li>
    <li class='alt'><span>           </span></li>
    <li class=''><span>                  </span><span class='keyword'>if</span><span>(!BACKUP.equals(</span><span class='string'>"1"</span><span>))      </span></li>
    <li class='alt'><span>                  {        </span></li>
    <li class=''><span>                      delete(vo);      </span></li>
    <li class='alt'><span>                  }      </span></li>
    <li class=''><span>                  </span><span class='keyword'>else</span><span>     </span></li>
    <li class='alt'><span>                  {        </span></li>
    <li class=''><span>                  delete(vo, </span><span class='keyword'>new</span><span> String[]{user,actionType,projectUtils.getVOId(vo)});      </span></li>
    <li class='alt'><span>           }      </span></li>
    <li class=''><span>    }      </span></li>
    <li class='alt'><span>    </span><span class='keyword'>catch</span><span>(Exception ex)      </span></li>
    <li class=''><span>    {      </span></li>
    <li class='alt'><span>        ex.printStackTrace();      </span></li>
    <li class=''><span>        result=</span><span class='string'>"JOBTITLE_DELETE_FAIL"</span><span>;      </span></li>
    <li class='alt'><span>    }      </span></li>
    <li class=''><span>    </span><span class='keyword'>return</span><span> result;      </span></li>
    <li class='alt'><span>}      </span></li>
    <li class=''><span>  </span></li>
    <li class='alt'><span/><span class='keyword'>protected</span><span>  </span><span class='keyword'>void</span><span> delete(Object vo) {}   </span></li>
    <li class=''><span/><span class='keyword'>protected</span><span> </span><span class='keyword'>void</span><span> delete(Object vo,String[] args){};   </span></li>
    <li class='alt'><span>  </span></li>
    <li class=''><span/><span class='keyword'>public</span><span> String onInsert(Object obj)      </span></li>
    <li class='alt'><span>{         </span></li>
    <li class=''><span>    String result=module+</span><span class='string'>"_INSERT_SUCC"</span><span>;;      </span></li>
    <li class='alt'><span>    </span><span class='keyword'>try</span><span>     </span></li>
    <li class=''><span>    {       </span></li>
    <li class='alt'><span>      Object vo=clientDataMap.get(</span><span class='string'>"VO"</span><span>);      </span></li>
    <li class=''><span>      </span><span class='keyword'>if</span><span>(!BACKUP.equals(</span><span class='string'>"1"</span><span>))      </span></li>
    <li class='alt'><span>                       insert(vo);      </span></li>
    <li class=''><span>      </span><span class='keyword'>else</span><span>     </span></li>
    <li class='alt'><span>        insert(vo, </span><span class='keyword'>new</span><span> String[]{</span><span class='string'>"Terry"</span><span>,actionType});      </span></li>
    <li class=''><span>    }      </span></li>
    <li class='alt'><span>    </span><span class='keyword'>catch</span><span>(Exception ex)      </span></li>
    <li class=''><span>    {      </span></li>
    <li class='alt'><span>        ex.printStackTrace();      </span></li>
    <li class=''><span>        result=module+</span><span class='string'>"_INSERT_FAIL"</span><span>;      </span></li>
    <li class='alt'><span>    }      </span></li>
    <li class=''><span>    log.info(</span><span class='string'>"GeneralPersistBO...INSERT()...result:"</span><span>+result);      </span></li>
    <li class='alt'><span>    </span><span class='keyword'>return</span><span> result;      </span></li>
    <li class=''><span>}     </span></li>
    <li class='alt'><span>  </span></li>
    <li class=''><span/><span class='keyword'>protected</span><span>  </span><span class='keyword'>void</span><span> insert(Object vo) {}   </span></li>
    <li class='alt'><span/><span class='keyword'>protected</span><span> </span><span class='keyword'>void</span><span> insert(Object vo,String[] args){};  </span></li>
</ol>
</div>
6 楼 生命火花 2007-03-12  
多态可以解决它的问题吗?好像只会增加复杂度!

接口不定啊!如果用多态,要写很多child!
5 楼 xly_971223 2007-03-12  
两个方法的重复代码结构都一样 如下
if(!BACKUP.equals("1"))   
                  {     
                      SpringDao.delete(vo);   
                  }   
                  else  
                  {     
         SpringBakDao.delete(vo, new String[]{user,actionType,projectUtils.getVOId(vo)});   
           }   

很明显这是一种多态。

解决方法:
interface Dao {
     onDelete(...);
     onInsert(...);
}
SpringDao implements Dao
SpringBakDao implements Dao
在Dao的上层去确定要调用SpringDao 或 SpringBakDao

这个问题是典型的用多态代替状态码的重构
4 楼 ahau205109 2007-03-12  
springdao extends basedao
    onDelete(do your work)
    oninsert(do your work)
    datasource:real system datasource
backdao  extends basedao
    onDelete(do your work)
    oninsert(do your work)
    datasource:baackup system datasource
daoHelper:
    getDao() due to your system;
client:
    daoHelper.getDao.oninsert(...);
   
   
3 楼 生命火花 2007-03-12  
引用
2 用proxy或interceptor, 都存在一个难点,不同DAO的相同的crud方法的参数都不一样的,就算同一个DAO类型的crud四个方法的参数个数也不一致,例如
SpringBakDao.delete(vo,new String[]{String id}),SpringBak.insert(vo,new String[]{String id,String newId}); 如果我用proxy模式,岂不是要传入最多的参数个数入这个proxy类里面,才能应付所有情况?



诚然,你自己已经知道问题的所在了!这个是个不可调和的问题!

你不封装参数提供统一接口就不能利用Aop去解决问题!

其实这就是个取舍!


不清楚你的这些操作到底有多少,但是理想设计上考虑应该包起来。不过到底有没有这个必要你自己要酌情考虑


但是写Adapter到这个地步是不是太晚了,不能再在Dao上做文章了,只能动Proxy!
2 楼 terry_yip 2007-03-12  
AOP和proxy是同样的道理, 不方便的地方,我上面提过了.
1 楼 XMLDB 2007-03-12  
这种场景比较适合用AOP.

相关推荐

    23种设计模式整理pdf

    设计模式是软件开发中的一种解决方案,旨在提高代码的可重用性、可维护性和可扩展性。在这篇文章中,我们将对23种常见的设计模式进行整理和解释。 1. Singleton 模式 Singleton 模式是一种创建型模式,用于限制类的...

    用设计模式解决多数据源问题

    这篇博客“用设计模式解决多数据源问题”探讨了如何利用设计模式来优雅地解决这类挑战。 首先,我们需要理解什么是设计模式。设计模式是软件设计中经过验证的、通用的解决方案模板,它描述了在特定上下文中反复出现...

    Java中23种设计模式(个人整理实用).doc

    这个模式解决了复杂对象的创建问题,提供了更多的灵活性和可扩展性。 4. 单态模式(Singleton Pattern) 单态模式是一种创建型设计模式,它提供了一种创建对象的接口,确保一个类只有一个实例,并提供了一个全局...

    24种设计模式以及混合设计模式

    在本文中,我们将深入探讨24种设计模式,并结合混合设计模式的概念,以及它们在实际项目中的应用案例。 首先,设计模式分为三大类:创建型、结构型和行为型。创建型设计模式关注对象的创建过程,如单例模式...

    设计模式(包含5个设计模式)含源代码报告.rar

    在软件开发领域,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。这个压缩包文件"设计模式(包含5个设计模式)含源代码报告.rar"显然是一份宝贵的资源,它涵盖了五个核心的设计模式,并附带了详细...

    Java之23种设计模式解析

    每一种设计模式都有其特定的适用场景和优缺点。例如,单例模式确保一个类只有一个实例,而工厂模式则提供了一种创建对象的接口,使得具体的对象创建过程可以延迟到子类。装饰器模式允许在运行时动态地给对象添加新的...

    23种面向对象设计模式

    面向对象设计模式是软件开发中的一种重要思想,它通过总结和提炼在软件设计过程中常见的问题和解决方案,形成了可复用的设计规范。标题提到的“23种面向对象设计模式”涵盖了设计模式的主要分类,这些模式在Java、...

    23种设计模式(C++).pdf

    《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》是一本深入探讨软件设计模式的书籍,它涵盖了创建型、结构型和行为型三种主要类型的23个经典设计模式,并提供了C++语言的实现代码。设计模式是软件工程中的...

    设计模式怎样解决设计问题

    在软件开发过程中,设计模式作为一种被广泛接受的解决方案,可以帮助开发者解决常见的设计问题,提高代码的可维护性和可扩展性。下面将详细介绍几种典型的设计模式及其应用场景。 #### 单例模式 单例模式确保一个...

    23种设计模式结构图

    代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。这种模式的优点是,它可以控制对对象的访问。 3. 适配器模式(Adapter) 适配器模式是一种结构型设计模式,它把一个类的接口变换...

    24种设计模式介绍与6大设计原则

    24种设计模式介绍与6大设计原则希望这本书的阅读者具备最基本的代码编写能力,您是一个初级的 coder,可以从中领会到怎么设计 一段优秀的代码;您是一个高级程序员,可以从中全面了解到设计模式以及 Java 的边角技术...

    设计模式 23种设计模式PPT

    设计模式是软件开发中一种广泛采用的实践,它代表了在特定上下文中解决常见问题的通用解决方案。设计模式并非具体的代码或库,而是对最佳实践的描述,它们是经过时间验证、可重用的代码设计模式,旨在提高代码的...

    浅析23种软件设计模式

    软件设计模式是软件开发中的一种解决方案,旨在解决软件设计中的各种问题。下面我们将对23种常见的软件设计模式进行浅析。 1. 工厂模式:工厂模式的主要思想是将客户类和工厂类分开,客户类可以向工厂类请求某种...

    12种设计模式

    在给定的“12种设计模式”中,我们可以深入探讨以下几种重要的设计模式: 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端需要创建一个对象时,它不会...

    23种设计模式幽默见解

    标题与描述中的“23种设计模式幽默见解”指向了软件工程领域中广泛采用的设计模式概念,通过一种轻松幽默的方式解读这些模式。设计模式是软件工程中为解决常见问题而形成的标准化解决方案,它们帮助开发者在面对特定...

    常见的23种设计模式的实例和名称,问题解决方案的描述

    ### 常见的23种设计模式的实例和名称,问题解决方案的描述 #### 一、概述 设计模式是一种经过验证的解决方案,用于解决在软件设计过程中经常遇到的问题。它们提供了一种标准化的方式来处理常见问题,使得软件更加...

    23种Java设计模式和15种J2EE设计模式.pdf

    设计模式是一种在特定情境下解决问题的模板,它描述了在软件设计中遇到的问题以及解决这些问题的方法。设计模式能够帮助开发者更高效、更优雅地解决常见的编程难题,提高代码的可读性、可维护性和可扩展性。 ### ...

    人人都懂设计模式 人人都懂设计模式

    设计模式是软件开发中的一种解决方案,它提供了一种通用的设计思想和方法论,可以帮助开发者更好地设计和实现软件系统。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中,作者罗伟富通过 ...

    五种常用的Java设计模式

    Java设计模式是软件开发中的一种重要概念,主要用来解决软件设计中的一些问题。下面将总结五种常用的Java设计模式,分别是单例模式、工厂模式、建造模式、_observer模式和迭代器模式。 单例模式 单例模式是一种创...

    几种设计模式的理解设计模式理解

    设计模式是软件开发中的一种重要概念,用于解决常见的设计问题并提供可复用的解决方案。以下是对几种设计模式的详细理解和应用。 1. 工厂模式 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在这...

Global site tag (gtag.js) - Google Analytics