- Classses
- inheritance
- methodOverloading
- methods
- oop
- oopAdvanced
- org.example
- polymorphism
Medium gün 3 ödev 4
SQL gün 3 ödev 5
Customerşervicelnterface.java
package org.example;
public interface CustomerServiceInterface
{
// interface => soyut
void add();
void update();
void delete();
}Customerşervicelnterface.javainterface ini kullanarak iki farklı class oluşturduk ve içerisindeki methodları implement ettik
CustomerService .java
package org.example;
// class extends class
// class implements interface
public class CustomerService implements CustomerServiceInterface
{
@Override
public void add() {
System.out.println("CustomerService.Add");
}
@Override
public void update() {
}
@Override
public void delete() {
}
}
// Çıplak class kalmasınCustomerManager.java
package org.example;
public class CustomerManager implements CustomerServiceInterface
{
@Override
public void add() {
System.out.println("CustomerManager.Add");
}
@Override
public void update() {
}
@Override
public void delete() {
}
}- böylece iki farklı class için de imzamız aynı oldu ve ilerleyen bir tarihte classda bir değişiklik yapmamız gerektiğinde veya aşağıdaki örnekteki gibi
CustomerManager.javaclassındanCustomerService .javaclass ına geçiş yapmamız gerektiğinde tek yapmamız gerekenCustomerService()kullanımı yerineCustomerManager()olarak kullanabilirim. - Tür yani
CustomerServiceInterfacekısmı değişmediği takdirde tüm methodlarım aynı olduğu için direk değişim yapabilriz. - Yani bir class a değil o class ın interface implementasyon yapması bu da o classın bizim dediklerimizi harfiyen yapması demek.
Main.java
package org.example;
public class Main
{
public static void main(String[] args)
{
//Customer individualCustomer2 = new IndividualCustomer();
CustomerServiceInterface customerService = new CustomerService();
customerService.add();
customerService.update();
customerService.add();
customerService.add();
customerService.add();
customerService.add();
}
}
// 15:05- programlamaya genelde
interfaceleriyani imzamızı tanımlayarak başlarız. - Burada ilk önce
dependencyinjectionpaketi altındaProductService.javadosyasında interface i aşağıdaki gibi oluşturduk
ProductService.java
package org.example.dependencyinjection;
public interface ProductService {
void add();
void update();
}- İmplementasyonu yaptığımız class için implementasyonu göstermek amacı ile
Productşervicelmpl.javaşeklinde isimlendirme yaparak bir dosya oluşturduk.
Productşervicelmpl.java
package org.example.dependencyinjection;
public class ProductServiceImpl implements ProductService{
@Override
public void add() {
// Repository nesnesi? // Bağımlılık
System.out.println("Service işlemleri bitti, repository işlemleri başlıyor..");
productRepository.addToDb();
}
@Override
public void update() {
productRepository.addToDb();
}
}Productşervicelmpl.javada bağlı olduğumuzRepositorynesnesi için de bir interface oluşturuyoruz
ProductRepository.java
package org.example.dependencyinjection;
public interface ProductRepository
{
void addToDb();
}- Ve bu interface i implemente etmek için
MySqlProductRepository.javadosyasında bir class oluşturduk
MySqlProductRepository.jav
package org.example.dependencyinjection;
public class MySqlProductRepository implements ProductRepository
{
@Override
public void addToDb() {
System.out.println("Mysql veritabanına ürün ekleniyor..");
}
}-
burada
ProductService.javainterface iProductRepository.javainterface ine bağımlı -
burada sıkı bağımlılığı kırmak için
MySqlProductRepositoryclasınıProductşervicelmpl.javaiçerisindeMySqlProductRepositoryı new lemekten kaçınmalıyız. Burada anlatmak istediğim sıkı bağımlılık,Productşervicelmpl.javae eklenecek yeni bir method için tekrardanMySqlProductRepositorynewlemek zorunda kalmak istememiz
- aynı zamanda somut class olarak implemente edilmesi doğru değildir. soyut bir değişkenle implemente edilmesi bağımlılığı azaltır.
- bu şekilde soyut olarak tanımlanmasına lose-coupling denir
- her ne kadar bu yapı çalışacak olsa da biz bağımlılığı her zaman ilgili class ı kullandığımız noktada çözmek isteriz. Class içerisinde değil.
- Bunu yapmak için de
cunstructor(CTOR) kullanabiliriz. cunstructorlerClassİsmi()şeklinde çağrıldığında class çalışmadan önce çalışır.
ProductServiceImpl.java
package org.example.dependencyinjection;
public class ProductServiceImpl implements ProductService{
ProductRepository productRepository;
// CTOR
public ProductServiceImpl(ProductRepository productRepository) {
this.productRepository = productRepository;
}
@Override
public void add() {
// Repository nesnesi? // Bağımlılık
System.out.println("Service işlemleri bitti, repository işlemleri başlıyor..");
productRepository.addToDb();
}
@Override
public void update() {
productRepository.addToDb();
}
}MongoDbProductRepository.java
package org.example.dependencyinjection;
public class MongoDbProductRepository implements ProductRepository{
@Override
public void addToDb() {
System.out.println("Mongodb veritabanına ürün ekleniyor..");
}
}Main.java
package org.example.dependencyinjection;
public class Main {
public static void main(String[] args) {
// IoC
ProductRepository productRepository = new MongoDbProductRepository();
ProductRepository productRepository1 = new MySqlProductRepository();
// Loose-coupling
ProductService productService = new ProductServiceImpl(productRepository); // mongodb
productService.add();
ProductService productService1 = new ProductServiceImpl(productRepository1); // mysql
productService1.add();
}
}- loose-coupling
- soyut+somut
Logger.java
package org.example.logging;
public interface Logger {
void log(String message);
}
FileLogger.java
package org.example.logging;
public class FileLogger implements Logger{
@Override
public void log(String message) {
System.out.println("Dosyaya loglandı:"+message);
// dosya aç, yaz, kaydet..
}
}DatabaseLogger.java
package org.example.logging;
public class DatabaseLogger implements Logger{
@Override
public void log(String message) {
System.out.println("Db'ye loglandı:"+message);
}
}- bağımlılık olduğu için yine CTOR içine eklememiz gerekiyor
ProductServiceImpI.java
package org.example.dependencyinjection;
import org.example.logging.Logger;
public class ProductServiceImpl implements ProductService{
ProductRepository productRepository;
Logger logger;
// CTOR
public ProductServiceImpl(ProductRepository productRepository, Logger logger) {
this.productRepository = productRepository;
this.logger=logger;
}
@Override
public void add() {
// Repository nesnesi? // Bağımlılık
System.out.println("Service işlemleri bitti, repository işlemleri başlıyor..");
productRepository.addToDb();
logger.logMessage("Add işlemi loglandı");
}
@Override
public void update() {
productRepository.addToDb();
}
}- burada olduğu gibi daha önceki örnekteki gibi logger i CTOR ile birlikte loose-coupling yaptık
Main.java
package org.example.dependencyinjection;
import org.example.logging.DatabaseLogger;
import org.example.logging.FileLogger;
import org.example.logging.Logger;
public class Main {
public static void main(String[] args) {
// IoC
ProductRepository productRepository = new MongoDbProductRepository();
ProductRepository productRepository1 = new MySqlProductRepository();
Logger fileLogger = new FileLogger();
Logger dbLogger = new DatabaseLogger();
// Loose-coupling
ProductService productService = new ProductServiceImpl(productRepository,fileLogger); // mongodb
productService.add();
ProductService productService1 = new ProductServiceImpl(productRepository1, dbLogger); // mysql
productService1.add();
}
}- Siz bir class a sahip olup yazılmış olan interface ile elde edilen loose-coupling implementasyonlarıyla (
FileLogger.javaveDatabaseLogger.java) her halükarda log işlemi yapmadan farklı somut işlemler gerçekleştirip sonrasında log işlemini hangi implementasyondan gerçekleşecekse onu gerçekleştirmesini istersenizabstract classkullanmanız gerekir
package org.example.logging;
// Hem soyut - hem somut işlevler içerebilen yapılardır.
public abstract class BaseLogger implements Logger
{
public void logMessage(String message)
{
System.out.println("Önce console'a loglandı:"+message);
log(message);
}
}- artık interfaceden implemente ettiğim logger classlarımı
BaseLoggerileextendsedebilirim
FileLogger.java
package org.example.logging;
public class FileLogger extends BaseLogger{
@Override
public void log(String message) {
System.out.println("Dosyaya loglandı:"+message);
// dosya aç, yaz, kaydet..
}
}DatabaseLogger.java
package org.example.logging;
public class DatabaseLogger extends BaseLogger{
@Override
public void log(String message) {
System.out.println("Db'ye loglandı:"+message);
}
}- Ve
main.javaveProductşervicelmpl.javada soyutluluğu bozmadanLoggeryerineBaseLoggerdan alabilirim
Productşervicelmpl.java
package org.example.dependencyinjection;
import org.example.logging.BaseLogger;
import org.example.logging.Logger;
public class ProductServiceImpl implements ProductService{
ProductRepository productRepository;
BaseLogger logger;
// CTOR
public ProductServiceImpl(ProductRepository productRepository, BaseLogger logger) {
this.productRepository = productRepository;
this.logger=logger;
}
@Override
public void add() {
// Repository nesnesi? // Bağımlılık
System.out.println("Service işlemleri bitti, repository işlemleri başlıyor..");
productRepository.addToDb();
logger.logMessage("Add işlemi loglandı");
}
@Override
public void update() {
productRepository.addToDb();
}
}Main.java
package org.example.dependencyinjection;
import org.example.logging.BaseLogger;
import org.example.logging.DatabaseLogger;
import org.example.logging.FileLogger;
import org.example.logging.Logger;
public class Main {
public static void main(String[] args) {
// IoC
ProductRepository productRepository = new MongoDbProductRepository();
ProductRepository productRepository1 = new MySqlProductRepository();
BaseLogger fileLogger = new FileLogger();
BaseLogger dbLogger = new DatabaseLogger();
// Loose-coupling
ProductService productService = new ProductServiceImpl(productRepository,fileLogger); // mysql
productService.add();
ProductService productService1 = new ProductServiceImpl(productRepository1, dbLogger); // mongodb
productService1.add();
}
}


