Quale modello di progettazione per la combinazione di oggetti in Java?

2

Sto cercando l'approccio migliore per progettare il seguente sistema:

  • Ho una classe di oggetti, chiamata Compilatori (C, Vai..Ecco)
  • Ho un'altra classe di oggetti, chiamata Protocolli (HTTP, RPC, WEBSOCKET..Etc)
  • Ho un'altra classe di oggetti, chiamata Serializzazione (BINARY, JSON..Etc)

Ora ogni compilatore deve essere abbinato all'implementazione corretta del protocollo e della serializzazione.

Ad esempio, se il compilatore è C, allora dovrebbe essere abbinato a CProtocolHTTP o CProtocolRPC rispetto al protocollo e CSerializationBinary o CSerializationJson wrt Serialization, se il compilatore è Go dovrebbe essere abbinato a GoProtocolHTTP o GoProtocolRPC rispetto al protocollo e GoSerializationBinary o GoSerializationJson wr Serialization.

Il cliente dovrebbe avere la possibilità di scegliere qualsiasi combinazione:

  • Vai con HTTP e BINARY
  • Vai con HTTP e JSON
  • Vai con RPC e BINARY
  • C con HTTP e JSON ... etc

Ho provato Factory e Strategy ma non sono riuscito a farli funzionare in modo pulito.

Quali sarebbero i modelli di progettazione giusti da utilizzare per implementarlo in Java?

    
posta devPsycho 06.08.2018 - 11:25
fonte

2 risposte

4

Sono sicuro che hai davvero bisogno di un modello di design specifico per risolvere il tuo problema. Penso che usare l'iniezione di dipendenza dovrebbe essere sufficiente.

La cosa più importante è richiedere sia un protocollo che un meccanismo di serializzazione per la creazione di un compilatore. Questo può essere applicato nel costruttore del compilatore.

Prima dichiara tutti i protocolli supportati sotto un'interfaccia comune:

public interface Protocol
{
    //...
}
public final class Http implements Protocol
{
    //...
}
...

Lo stesso per la serializzazione

public interface Serialization
{
    //...
}
public final class Binary implements Serialization
{
   //...
}
...

Quindi ogni possibile compilatore può essere dichiarato come segue

public interface Compiler
{
    //...
}
public final class Go implements Compiler
{
    private final Protocol protocol;
    private final Serialization serialization;
    public GoCompiler(Protocol protocol, Serialization serialization)
    {
        this.protocol = protocol;
        this.serialization = serialization;
    }
    //...
}
...

L'utilizzo finale sarà simile a questo:

Compiler c1 = new Go(new Http(), new Binary());
Compiler c2 = new Go(new Http(), new Json());
Compiler c3 = new Go(new Rpc(), new Binary());
Compiler c4 = new C(new Http(), new Binary());
    
risposta data 06.08.2018 - 15:24
fonte
3

Se le classi Protocollo e Serializzazione sono indipendenti l'una dall'altra, ma entrambe dipendono dal compilatore, questa situazione si adatta al modello Abstract Factory .

In sostanza, avresti due classi factory per ogni compilatore per creare le istanze di protocollo corrette e una per creare le istanze di serializzazione.

Nello pseudo-codice, la struttura della classe potrebbe essere simile a questa.

interface IProtocolFactory {
  IProtocol createHttp()
  IProtocol createRpc()
  ...
}

interface ISerializationFactory {
  ISerializer createJson()
  ...
}

interface IFactoryFactory {
  IProtocolFactory getProtocolFactory()
  ISerializationFactory getSerializationFactory()

  static IFactoryFactory getFactory(Compiler x)
  {
    if x == C then return new CObjectsFactory()
    if x == Go then return new GoObjectsFactory()
    ...
  }
}

class CObjectsFactory implements IFactoryFactory {
  IProtocolFactory getProtocolFactory() 
  { 
    return new CProtocolFactory() 
  }
  ISerializationFactory getSerializationFactory()
  { 
    return new CSerializationFactory() 
  }
}

class CProtocolFactory implements IProtocolFactory {
  IProtocol createHttp()
  { 
    return new CProtocolHTTP() 
  }
}
    
risposta data 06.08.2018 - 12:38
fonte

Leggi altre domande sui tag